###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.allSettled()

据官方文档所知:
此方法与Promise.all相似,只是,Promise.all会有两个状态,成功/失败,而Promise.allSettled只会有一个完成状态,即,无论子Promise是否成功,均会调用.then参数的第一个方法

Promise.allSettled([p1,p2,p3])

Promise.allSettled应传入一个数组,数组对象均为Promise对象,当Promise.all中,所有的promise对象均出现结果后才会执行.allSettled中的.then回调,返回的数组为三个对象,我们尝试写一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
myPromise.allSettled = function(promiseArr=[]){
let resultArr = [];//当前已完成的子promisedata结果
let okNum = 0;
return new myPromise((resolve,reject)=>{
function doCallBack(){//执行结果
if(okNum==promiseArr.length){
resolve(resultArr)
}
}
promiseArr.forEach((item)=>{
item.then((data)=>{
resultArr.push({
status:"fulfilled",
value:data
});
okNum++;
doCallBack()
},(data)=>{
resultArr.push({
status:"rejected",
value:data
});
okNum++;
doCallBack()
})
})
})
}

按照原理,每一个子promise进行resolve后,都会判断是否已完成了所有的promise,已完成则返回一个新的resolve状态的Promise,来完成接下来应该.then的事情

这样就完成了Promise.all的功能了

#Promise.any()

据官方文档所知:

Promise.any()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。子Promise中任意一个Promise完成时,就触发.then,成功触发.then中第一个方法,失败触发.then中第二个方法

同样的,在.all方法中,修改一下执行.then的条件即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
myPromise.any = function(promiseArr=[]) {
return new myPromise((resolve,reject)=>{
let resultArr = [];
let okNum = 0;
function doCallBack(){//执行结果
if(okNum==promiseArr.length){
reject(resultArr)
}
}
promiseArr.forEach((item)=>{
item.then((data)=>{
this.status="fulfilled";
resolve(data);
},(data)=>{
okNum++
resultArr.push('reject')
})
})
})
}

这样就完成了Promise.any的功能了,但是此功能是提案中,经测试,现在的chrome里并不能支持此项,如果需要使用,可以copy上方代码,到项目中使用此功能

截止此张,已完成了Promise方法中一半功能的原理了