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

据官方文档所知:

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。子Promise全部完成时,触发.then

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
myPromise.all = function(promiseArr=[]){
let resultArr = [];//当前已完成的子promisedata结果
new myPromise((resolve)=>{
promiseArr.forEach((item)=>{
item.then((data)=>{
resultArr.push(data);
if(resultArr.length==promiseArr.length){
resolve(resultArr)
}
})
})
})
}

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

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

#Promise.prototype.race()

据官方文档所知:

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

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

1
2
3
4
5
6
7
8
9
myPromise.race = function(promiseArr=[]){
new myPromise((resolve)=>{
promiseArr.forEach((item)=>{
item.then((data)=>{
resolve(data)
})
})
})
}

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

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