Promise.all
全部成功才 resolve,有一个失败就 reject,返回结果顺序和输入顺序一致
Promise.myAll = function (promises) {
return new Promise((resolve, reject) => {
if (promises.length == 0) {
return resolve([])
}
const result = []
let count = 0
promises.forEach((p, index) => {
Promise.resolve(p).then(value => {
result[index] = value
count++
if (count == promises.length) {
resolve(result)
}
}, reject)
})
})
}Promise.allSettled
不会 reject,返回所有结果(成功/失败都有)
Promise.myAllSettled = function (promises) {
return new Promise(resolve => {
if (promises.length == 0) {
return resolve([])
}
const result = []
let count = 0
promises.forEach((p, index) => {
Promise.resolve(p)
.then(
value => {
result[index] = { status: 'fulfilled', value }
},
reason => {
result[index] = { status: 'rejected', reason }
}
)
.finally(() => {
count++
if (count == promises.length) {
resolve(result)
}
})
})
})
}Promise.race
谁先完成用谁(成功或失败)
Promise.myRace = function (promises) {
return new Promise((resolve, reject) => {
promises.forEach(p => {
Promise.resolve(p).then(resolve, reject)
})
})
}Promise.any
只要有一个成功就 resolve,全部失败才 reject(返回 AggregateError)
Promise.myAny = function (promises) {
return new Promise((resolve, reject) => {
if (promises.length == 0) {
return reject(new AggregateError([], 'All promises were rejected'))
}
const errors = []
let count = 0
promises.forEach((p, index) => {
Promise.resolve(p).then(resolve, err => {
errors[index] = err
count++
if (count == promises.length) {
reject(new AggregateError(errors, 'All promises were rejected'))
}
})
})
})
}