Promise 实现链式调用主要依赖于其返回一个新的 Promise 对象的特性。
在 JavaScript 中,Promise 是一个处理异步操作的对象,可以在原调用位置以同步方式处理异步操作结果。
下面是 Promise 的链式调用的基本实现:
- Promise 构造函数接收一个执行函数,执行函数接收两个参数:resolve 和 reject,分别用于异步操作成功与失败的情况。
- 调用 Promise 对象的
.then
方法提供链式调用。.then
方法接收两个参数(都是可选的):onFulfilled
和onRejected
,分别在 Promise 成功或失败时调用。.then
方法也返回一个 Promise 对象,以便进行链式调用。 - 如果
onFulfilled
或onRejected
返回一个值 x,运行 Promise 解决过程:[Promise Resolution Procedure]。 - 如果
onFulfilled
或onRejected
抛出一个异常 e,Promise.then
的返回的 Promise 对象会被 reject 掉。 - 如果
onFulfilled
不是函数且 promise1(前一个 promise) 成功执行,promise2(下一个 promise)成功处理 promise1 的 final state。 - 如果
onRejected
不是函数且 promise1 失败,promise2 会拒绝 promise1 的原因。
以下是一个示例:
javascriptnew Promise(function(resolve, reject) { setTimeout(() => resolve(1), 1000); // 第一步:创建一个 Promise 并执行一个异步操作 }).then(function(result) { // 第二步:注册一个 onFulfilled 回调 console.log(result); // 打印:1 return result + 2; }).then(function(result) { // 第三步:链式调用 console.log(result); // 打印:3 return result + 2; }).then(function(result) { console.log(result); // 打印:5 return result + 2; });
在这个例子中,每个 .then
调用后都返回一个新的 Promise 对象,这个新的 Promise 对象会立即执行,并在执行完毕后调用下一个 .then
注册的回调。通过这种方式,我们可以以同步的方式处理异步的结果,而这就是 Promise 链式调用的本质。