all方法
// all: 传入的所有Promise最终都转化为fulfilled态时,则会执行resolve回调,并将返回值是的所有的Promise的resolve的回调的value的数组。
// 其中一个任何Promise为reject状态时,则返回的Promise的状态更改为rejected。
function all(arr) {
//返回一个promise
return new Promise((resolve, reject) => {
let length = arr.length //传入的promise的个数
let count = 0 //进入fullfilled的promise个数
const result = [] //创建一个等长的数组,放置结果
// 当传递是一个空数组,返回一个为fulfilled状态的promise
if (arr.length === 0) {
return new Promise.resolve(arr)
}
for (let i = 0; i < arr.length; i++) {
arr[i].then(resolve => {
result.push(resolve) //将每次结果保存在result数组中
count++ //个数加1
//是否所有的promise都进入fullfilled状态
if (count === length) {
resolve(result) //返回结果
}
}).catch(e => {
reject(e) //如果有错误则直接结束循环,并返回错误
})
}
})
}
race方法
//race: 传入的所有Promise其中任何一个有状态转化为fulfilled或者rejected,则将执行对应的回调。
function race(arr) {
return new Promise((res, rej) => {
for (let i = 0; i < arr.length; i++) {
arr[i].then(resolve => {
res(resolve) //某一promise完成后直接返回其值
}).catch(e => {
rej(e) //如果有错误则直接结束循环,并返回错误
})
}
})
}
any方法
// 只需要有一个成功的即可
function any(arr){
return new Promise((resolve,reject) => {
let result = []
let len = arr.length
let rejectCount = 0
for(let i = 0;i<len;i++){
arr[i].then(res => {
resolve(res)
}).catch(e => {
result.push(e)
if(rejectCount === len){
reject(result)
}
})
}
})
}