为什么Promise可以链式调用?

305 阅读2分钟

Promise可以链式调用的核心原因在于其设计上的两个关键特性:then 方法和返回值自动解析为 Promise。

1. then 方法

Promise 对象提供了一个 then 方法,这个方法接受两个可选的回调函数作为参数:onFulfilled 和 onRejected。这两个函数分别对应于 Promise 成功(fulfilled)和失败(rejected)时的处理逻辑。

2. 返回值自动解析为 Promise

then 方法本身会返回一个新的 Promise 对象。这个新 Promise 的结果由 then 方法中回调函数的返回值决定:

  • 如果回调函数返回了一个值(非 Promise),则新 Promise 将以此值作为结果(fulfilled)解决。
  • 如果回调函数抛出了一个错误,则新 Promise 将以这个错误作为原因(rejected)解决。
  • 如果回调函数返回了一个 Promise,则新 Promise 将等待这个返回的 Promise 解决,并以其结果作为自己的结果。

链式调用的实现

由于 then 方法返回一个新的 Promise,并且这个新 Promise 的结果依赖于前一个 then 方法中回调函数的返回值,因此可以连续调用 then 方法,形成链式调用。每个 then 方法都处理前一个 Promise 的结果,并可能返回一个新的值或 Promise,供下一个 then 方法处理。

示例

new Promise((resolve, reject) => {  
    resolve(1);  
})  
.then(result => {  
    console.log(result); // 输出 1  
    return result * 2; // 返回 2  
})  
.then(result => {  
    console.log(result); // 输出 2  
    return result * 2; // 返回 4  
})  
.then(result => {  
    console.log(result); // 输出 4  
});

在这个例子中,每个 then 方法都接收前一个 then 方法返回的结果,并返回一个新的值,供下一个 then 方法处理。这就实现了 Promise 的链式调用。

总结

Promise 的链式调用依赖于 then 方法的返回值自动解析为 Promise 的特性,这使得我们可以顺序地处理异步操作的结果,并以一种清晰和直观的方式组织代码。