企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[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<funcArr.length;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"}] ~~~