最近面试被问到Promise.all怎么获取成功和失败的结果,实际上Promise.all是无法做到,但是处于提案阶段的Promise.allSettled正好可以满足这个场景。其实现原理和Peomise.all大同小异,无非是在resolve或者reject时做一个判断,判断所有的promise是否都已经处理完,处理完即可改变Promise的状态,返回结果。
Promise.allSettled = function (promises) { return new Promise(resolve => { let count = 0; const length = promises.length; const result = []; promises.forEach((promise, index) => { Promise.resolve(promise).then(value => { count++ result[index] = { status: 'fulfilled', value } if (count === length) { resolve(result) } }, reason => { count++ result[index] = { status: 'rejected', reason } if (count === length) { resolve(result) } }) }) }) } const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve("123") }, 500); }) const p2 = new Promise((resolve, reject) => { reject("456") }) const p3 = new Promise((resolve, reject) => { setTimeout(() => { reject("789") }, 2000); }) Promise.allSettled([Promise.resolve('resolve'), p1, 'abc', p2, p3, Promise.reject('error')]) .then(res => { console.log(res) })