Node.js 非常擅长处理不需要立即执行的任务,比如从网站获取数据。Promise 链式调用(Chaining)帮助我们按特定顺序管理这些任务,使它们依次执行。
- 顺序执行: 确保异步任务按特定顺序运行,每个任务都等待前一个任务的结果。
- 错误处理: 提供了一种处理异步操作错误的清晰方法,确保任何问题都能被捕获并得到处理。
语法
promise
.then(value => {
return newValue;
})
.then(newValue => {
return anotherValue;
})
.catch(error => {
});
- .then() 处理 promise 的结果,并可以返回一个新值或一个新的 promise。
- .catch() 处理 promise 链中发生的错误。
Promise 链的工作原理
Promises 就像是为将来才会发生的事情(比如来自服务器的数据)预留的占位符。链式调用让我们可以决定在事情发生后要做什么。
- 每个 .then() 都会接收上一步的结果。你可以使用这个结果,然后将新的东西传递给下一步。
- 从 .then() 返回一个值会自动创建一个新的 promise 来承载该值。这使得链得以继续。如果你从 .then() 返回一个 promise,该链会等待这个 promise 完成后再继续。
- 末尾的 .catch() 就像是一张安全网。它会捕获链中任何步骤可能发生的任何错误。
现在让我们通过一个示例来理解 promise 链
javascript
CODEBLOCK_65e6cb4d
Output
First then: 10
Second then: 20
Final value: 25
- 创建了一个新的 Promise myPromise,它在 500ms 后以值 10 解析(resolve)。
- 第一个 .then 接收解析后的值 (10),将其打印,并返回该值乘以 2 的结果。
- 第二个 .then 接收来自上一个 .then 的结果 (20),将其打印,并返回该值加上 5 的结果。
- 最后一个 .then 接收结果 (25) 并将其打印。这是链的终点。
- .catch 块将处理 promise 链中可能发生的任何错误。
在 Promise 链中处理错误
错误处理在异步代码中至关重要。Promise 链提供了一种管理错误的清晰方法。
JavaScript
CODEBLOCK_ec667fab
Output
Error: Something went wrong!
- Promise 在 500ms 后被拒绝(rejected)。
- .then 块被跳过,因为 promise 被拒绝了。
- .catch 块被执行,打印出错误信息。
Promise 链与 Async/Await 的对比
虽然 Promise 链相比回调函数提高了可读性,但 async/await 提供了一种更像同步代码的方法。
使用 Async/Await (等效代码)
JavaScript
CODEBLOCK_8b2b180a
主要区别
Promise 链
—
中等
.catch()
较难
较高