手写Promise.allsettled方法

之前实现过Promsie.all方法,但是all这个方法如果有一个失败了就相当于全部失败了,这种对体验和交互都不友好,Promise.allsettled就是改进版,有失败还会继续执行,等所有的Promsie执行完返回一个对象数组。

  1. Promise.allsettled方法和Promsie.all方法接收参数一样。
  2. 执行完返回一个数组对象每个结果对象,都有一个 status 字符串。如果它的值为 fulfilled,则结果对象上存在一个 value 。如果值为 rejected,则存在一个 reason 。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Promise.myAllsettled = function(list) {
if (list.length === 0) return Promise.resolve([])
const results = []
let count = 0

const settled = (index, status, res, resolve) => {
results[index] = {
status,
...res
}
count += 1
if (count == list.length) {
resolve(results)
}
}
return new Promise((resolve) => {
list.map((item, index) => {
// 把数据都处理成Promise
Promise.resolve(item).then(
res => {
settled(index, 'fulfilled', {value: res}, resolve)
},
err => {
settled(index, 'rejected', {reason: err}, resolve)
}
)
})
})
}

demo

demo地址

参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled