手写Promise.allsettled方法
之前实现过Promsie.all方法,但是all这个方法如果有一个失败了就相当于全部失败了,这种对体验和交互都不友好,Promise.allsettled就是改进版,有失败还会继续执行,等所有的Promsie执行完返回一个对象数组。
- Promise.allsettled方法和Promsie.all方法接收参数一样。
- 执行完返回一个数组对象每个结果对象,都有一个 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