函数式编程之Promise的奇幻漂流
2023-10-14 09:06:30
Promise的奇幻漂流
在上一篇文章中,我们介绍了同步链式处理数据函子的概念。在本节中,我们将讨论异步。所涉及的概念非常简单,不需要函数式编程基础。当然,如果你读过那篇《在你身边你左右——函数式编程别烦恼》,你就会更容易理解。在本文中,我们将完成一个Promise代码的编写。
从简单的开始
为了说明Promise是如何工作的,我们从一个非常简单的例子开始。假设我们有一个函数,它需要一段时间才能完成。在这个例子中,我们将使用setTimeout()
函数来模拟一个需要花费一些时间才能完成的操作。
function longRunningOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Hello, world!");
}, 1000);
});
}
在这个函数中,我们首先创建一个新的Promise对象。这个对象有两个参数:resolve
和reject
。resolve
函数用于将值传递给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的更多高级用法。