###promise原理系列目录:

promise实现原理(一)promise.then

promise实现原理(二)promise.catch

promise实现原理(三)promise.finally

promise实现原理(四)promise.all与promise.race

promise实现原理(五)promise.allSettled与promise.any

promise实现原理(六)promise.resolve与promise.reject

promise实现最终版!合成代码

还缺失的内容↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

1
2
3
4
5
6
7
8
9
10
//标准提到,一个promise只有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)//已完成
Promise.prototype.then(); //已完成
Promise.prototype.catch(); //已完成
Promise.prototype.finally();
Promise.all();
Promise.race();
Promise.allSettled();
Promise.any();
Promise.resolve();
Promise.reject();

#Promise.prototype.finally()

据官方文档所知:

finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

可以理解为,Promise中,无论任何状态,执行毁掉之后,都会执行finally方法,我们稍微修改一下上一期的方法中

myPromise中的doCallback方法,判断一下,如果没有传入.reject则调用.catch方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
self.doCallback=function(){//执行回调函数
let callBackArr = []
if(self.status == 'resolved'){//取构造函数中保存的data,传入callback方法里
callBackArr = self.callbackObj.resolveCallback;
}else if(self.status == 'rejected'){
if(self.callbackObj.rejectCallBack[0]){
callBackArr = self.callbackObj.rejectCallBack;
}else{
callBackArr = [self.callbackObj.catchCallBack];
}
}
if(callBackArr&&callBackArr.length>0){
callBackArr.forEach((item)=>{
item(self.data)
})
}
if(self.callbackObj.finallyCallback){
self.callbackObj.finallyCallback()
}
}

还需要为myPromise来补一个finally的回调

1
2
3
myPromise.prototype.finally=function(finallyCallback){
this.callbackObj.finallyCallback=finallyCallback;
}

现在我们发现.finally方法已经可以正式调通了

1
2
3
4
5
6
7
new myPromise((resolve,reject)=>{
reject('reject')
}).catch((data)=>{
console.log(data,'catch');//reject,catch
}).finally((data)=>{
console.log(data,'finally');//reject,catch
})

如此,我们便完成了.finally回调啦