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 的特性,这使得我们可以顺序地处理异步操作的结果,并以一种清晰和直观的方式组织代码。