[TOC]
>[success] # Promise.allSettled
**Promise.allSettled** 方法与 **Promise.all** 不同点:
1. **Promise.all** : 有一个请求错误,直接走 **.catch** ,不再走 **.then** 。
2. **Promise.allSettled** : **无论请求对错最终都会返回一个数组对象** 到 **.then** 中,并切**返回的数据中标识了错误跟正确数据的区别** 。
以上就是 **Promise.allSettled** 方法与 **Promise.all** 的区别,但是 **Promise.allSettled** 是新出方法 **部分浏览器不支持** ,如下 **Promise.allSettled** 是第四阶段的草案 ,所以想使用这个方法,可以使用 **babel垫片** 或者自己 **手动封装一个** , 我们要实现的就是后者。
![](https://img.kancloud.cn/ac/c7/acc7d1a215dde6b51f97dad1bb6a2714_1141x208.png)
>[success] ## 封装 allSettled 方法
**allSettled 方法代码如下**
~~~
let allSettled = (funcArr) => {
return new Promise((resolve) => {
let sttled = 0
let result = []
for(let index = 0;index
const element = funcArr[index]
element
.then(res => {
result[index] = {
status: 'fulfilled',
value: res
}
})
.catch(err => {
result[index] = {
status: 'rejected',
reason: err
}
})
.finally(() => { ++sttled === funcArr.length && resolve(result) })
}
})
}
~~~
使用时
~~~
const promises = [
Promise.reject('c'),
Promise.resolve('a'),
Promise.resolve('b'),
];
allSettled(promises).then(res => {
console.log(res)
})
// 打印结果
// [{"status":"rejected","reason":"c"},
// {"status":"fulfilled","value":"a"},
// {"status":"fulfilled","value":"b"}]
~~~