Promise 身上的这些方法返回的都是一个 PromisePromise.resolve 接受一个 Promise,若非 promise 则将其变成功状态的 Promise
Promise.all
Promise.all 有一个失败则返回失败的结果,全部成功返回全成功的数组
Promise.all=function (promiseList= []) {
returnnewPromise((resolve, reject) => {
if (promiseList.length===0) returnresolve([])
constresult= []
letcount=0
for (leti=0; i<promiseList.length; i++) {
Promise.resolve(promiseList[i]).then(res=> {
result[i] =res
count++
// 不能直接通过 result.length 进行比较,因为会存在下标大的先赋值
// 例如 i = 3 第一个返回结果,此时数组变为[empty,empty,empty,res]
if (count===promiseList.length) {
resolve(result)
}
}).catch(e=> {
reject(e)
})
}
})
}
Promise.any
Promise.any 和 Promise.all 相反,全部失败返回失败的结果数组,有一个成功则返回成功结果AggregateError,当多个错误需要包装在一个错误中时,该对象表示一个错误。
Promise.any=function (promiseList= []) {
returnnewPromise((resolve, reject) => {
if (promiseList.length===0) returnresolve([])
constresult= []
letcount=0
for (leti=0; i<promiseList.length; i++) {
Promise.resolve(promiseList[i]).then(res=> {
resolve(res)
}).catch(e=> {
result[i] =res
count++
if (count===promiseList.length) {
reject(newAggregateError(result))
}
})
}
})
}
Promise.race
Promise.race 返回第一个成功或失败的结果
Promise.race=function (promiseList= []) {
returnnewPromise((resolve, reject) => {
if (promiseList.length===0) returnresolve([])
for (leti=0; i<promiseList.length; i++) {
Promise.resolve(promiseList[i]).then(res=> {
resolve(res)
}).catch(e=> {
reject(e)
})
}
})
}
Promise.allSettled
Promise.allSettled 无论成功与否都返回,但是会添加一个 status 字段用于标记成功/失败
Promise.allSettled=function (promiseList= []) {
returnnewPromise((resolve,reject) => {
if (!promiseList.length) returnresolve([])
constresult= []
letcount=0
constaddRes= (i, data) => {
result[i] =data
count++
if (count===promiseList.length) {
resolve(result)
}
}
for (leti=0; i<promiseList.length; i++) {
Promise.resolve(promiseList[i]).then(res=> {
addRes(i, {status: 'fulfilled', data: res})
}).catch(e=> {
addRes(i, {status: 'rejected', data: e})
})
}
})
}