# 实现Promise.allSettled()
作用:方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。当有多个彼此不依赖的异步任务成功完成时,或者您总是想知道每个promise的结果时,就可以使用它。相比之下,Promise.all() 更适合彼此相互依赖或者在其中任何一个reject时立即结束的情况。
const promise1 = Promise.resolve('hello')
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'problem'))
Promise.allSettled([promise1, promise2])
.then((values) => {
console.log(values)
})
// [
// { status: 'fulfilled', value: 'hello' },
// { status: 'rejected', reason: 'problem' }
// ]
自定义实现:
/**
* @param {*} arr 待处理的promise数组
*/
const allSet = arr => {
return new Promise((resolve) => {
let result = []
let index = 0
const addIndex = (key, value, status) => {
let obj = {
status,
value
}
result[key] = obj
index++
// 当数组全部处理完时,直接返回即可
if (index === arr.length) {
resolve(result)
}
}
for (let i = 0; i < arr.length; i++) {
let cur = arr[i]
if (cur instanceof Promise) {
// 记录该promise的状态
cur.then(
(value) => {
addIndex(i, value, 'fulfilled')
},
(reason) => {
addIndex(i, reason, 'rejected')
}
)
} else {
addIndex(i, cur, 'fulfilled')
}
}
})
}
// 开始测试
const promise1 = Promise.resolve('success')
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 200, 'error'))
allSet([promise1, promise2])
.then((values) => {
console.log(values)
})
// [
// { status: 'fulfilled', value: 'hello' },
// { status: 'rejected', value: 'problem' }
// ]