Promise的简易实现(2)
发布网友
发布时间:2023-03-14 20:31
我来回答
共1个回答
热心网友
时间:2023-10-24 05:06
在上一篇文章里面,我们实现了一个简单的 Promise ,已可以满足一些较简单的场景。但却无法进行then的Promise链式衔接,比如这样:
这种场景相信用过 promise 的人都知道会有很多,那么类似这种就是所谓的 链式Promise 。
链式Promise是指在当前promise达到 fulfilled 状态后,即开始进行下一个promise(后邻promise)。那么我们如何衔接当前promise和后邻promise呢?(这是这里的难点)。
只需在then方法里面return一个promise就好啦。可见Promises/A+规范中的2.2.7
Promise/A+规范
1.then方法中,创建并返回了新的Promise实例,这是串行Promise的基础,并且支持链式调用。
2.handle方法是promise内部的方法。then方法传入的形参onFulfilled以及创建新Promise实例时传入的resolve均被push到当前promise的callbacks队列中,这是衔接当前promise和后邻promise的关键所在(这里一定要好好的分析下handle的作用)。
3.testAsyncFunc1生成的promise(简称testPromise1)异步操作成功,执行其内部方法resolve,传入的参数正是异步操作的结果123
4.调用handle方法处理callbacks队列中的回调:testAsyncFunc2 方法,生成新的promise(testAsyncFunc2 promise)
5.执行之前由testAsyncFunc1 promise的then方法生成的新promise(称为bridge promise)的resolve方法,传入参数为testAsyncFunc1 promise。这种情况下,会将该resolve方法传入testAsyncFunc2 promise的then方法中,并直接返回。
6/在testAsyncFunc2 promise异步操作成功时,执行其callbacks中的回调:testAsyncFunc1 bridge promise中的resolve方法
7.最后执行testAsyncFunc1 bridge promise的后邻promise的callbacks中的回调。
// 关键tip-2
1: 链式 promise 之间有一个桥梁 promise ,可称之为 bridge promise ,用于衔接两个 promise ,包装在 then 函数中 2: 当前一个 promise resolve 之后, bridge promise 负责传递之前 promise 的值
3: 将当前 promise 的值和 bridge promise 的 resolve 方法传给下一个 promise 之后,在下一个 promise resolve 的时候,执行 bridge promise 的 resolve 方法,再执行本身后注册的 then 函数中的 promise resolve
4: 执行完四个 promise(promise 1 - getUserId, promise 2 - getUserId bridge, promise 3 - getUserInfoById, promise 4 - getUserInfoById bridge) 之后,继续执行后面的 then 函数