三、至此异步和链式调用
此时初版还有三个方向需要完善:
1. Promise内部异步代码执行的问题。
2. Promise的链式调用
3. 值传透
支持异步代码
开发中经常会将接口放于promise
内部,等接口请求响应成功把数据resolve
出去,或失败时把数据reject
出去,此时then、catch
才会进行捕获.
而现在的代码,promise
内部如果有异步代码执行后才resolve
,then
不会等待异步代码执行完毕会立即执行,所以此时状态是PENDING,不会触发then
的回调函数.
新增onFulfilledCallbacks、onRejectedCallbacks维护成功态、失败态任务队列:
1 | //定义三种状态 |
实现链式调用
Promise
的一大优势就是支持链式调用,具体来说就是then
方法的具体实现,实际上是返回了一个Promise
,需要注意的几个点:
- 保存之前的
promise
实例的引用,即保存this
- 根据
then
回调函数执行的返回值
- 如果是promise实例,那么返回的下一个promise实例会等待这个promise状态发生变化
- 如果不是promise实例,根据目前情况直接执行
resolve
或reject
完善then
函数:
1 | then(onFulfilled, onRejected) { |
值传透
Promise
支持值穿透
1 | let promise = new Promise((resolve, reject) => { |
then
参数期望是函数,传入非函数则会发生值穿透。值传透可以理解为,当传入then
的不是函数的时候,这个then
是无效的。
原理上是当then中传入的不算函数,则这个promise返回上一个promise的值,这就是发生值穿透的原因,所以只需要对then的两个参数进行设置就行了:
1 | onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value; |
完整的then
函数代码:
1 | then(onFulfilled, onRejected) { |
作者:洛霞
链接:https://juejin.im/post/6860037916622913550
来源:掘金