返回

函数式编程之Promise的奇幻漂流

前端

Promise的奇幻漂流

在上一篇文章中,我们介绍了同步链式处理数据函子的概念。在本节中,我们将讨论异步。所涉及的概念非常简单,不需要函数式编程基础。当然,如果你读过那篇《在你身边你左右——函数式编程别烦恼》,你就会更容易理解。在本文中,我们将完成一个Promise代码的编写。

从简单的开始

为了说明Promise是如何工作的,我们从一个非常简单的例子开始。假设我们有一个函数,它需要一段时间才能完成。在这个例子中,我们将使用setTimeout()函数来模拟一个需要花费一些时间才能完成的操作。

function longRunningOperation() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("Hello, world!");
    }, 1000);
  });
}

在这个函数中,我们首先创建一个新的Promise对象。这个对象有两个参数:resolverejectresolve函数用于将值传递给Promise,reject函数用于将错误传递给Promise。

然后,我们使用setTimeout()函数来模拟一个需要花费一些时间才能完成的操作。在这个例子中,我们让setTimeout()函数延迟1000毫秒(1秒)才执行resolve函数。

setTimeout()函数执行resolve函数时,它会将"Hello, world!"字符串传递给Promise。这将导致Promise的状态从“pending”变为“resolved”。

使用Promise

现在我们已经知道如何创建一个Promise,我们就可以开始使用它了。我们可以使用.then()方法来将一个回调函数附加到Promise上。当Promise的状态变为“resolved”时,这个回调函数就会被调用。

longRunningOperation().then((result) => {
  console.log(result); // "Hello, world!"
});

在这个例子中,我们使用.then()方法将一个回调函数附加到longRunningOperation()函数返回的Promise上。当Promise的状态变为“resolved”时,这个回调函数就会被调用。在这个回调函数中,我们将结果打印到控制台。

处理错误

我们还可以使用.catch()方法来将一个回调函数附加到Promise上。当Promise的状态变为“rejected”时,这个回调函数就会被调用。

longRunningOperation().catch((error) => {
  console.log(error);
});

在这个例子中,我们使用.catch()方法将一个回调函数附加到longRunningOperation()函数返回的Promise上。当Promise的状态变为“rejected”时,这个回调函数就会被调用。在这个回调函数中,我们将错误打印到控制台。

更多高级用法

Promise还有一些更高级的用法。例如,我们可以使用.finally()方法来将一个回调函数附加到Promise上。无论Promise的状态是“resolved”还是“rejected”,这个回调函数都会被调用。

longRunningOperation().finally(() => {
  console.log("This will always be called.");
});

在这个例子中,我们使用.finally()方法将一个回调函数附加到longRunningOperation()函数返回的Promise上。无论Promise的状态是“resolved”还是“rejected”,这个回调函数都会被调用。在这个回调函数中,我们将一条消息打印到控制台。

结论

Promise是JavaScript中用于异步编程的API。它允许您在代码执行时执行其他操作,然后在操作完成时再执行后续代码。在本教程中,我们向您展示了如何使用Promise来编写异步代码。我们从实现一个只有十几行代码能够解决异步链式调用的Promise代码开始,然后我们探讨了Promise的更多高级用法。