Promise.allSettled的兼容写法

1,820 阅读1分钟

由ES2020提供的Promise.allSettled,目前各个浏览器的支持情况并不理想,如下是pollify的兼容写法

if (!Promise.allSettled) {
    const rejectHandler = reason => ({status: "rejected", reason})
    const resolveHandler = value => ({status: "fulfilled", value})
    Promise.allSettled = promises =>
            Promise.all(
                    promises.map((promise) =>
                            Promise.resolve(promise)
                                    .then(resolveHandler, rejectHandler)
                    )
                    // 每个 promise 需要用 Promise.resolve 包裹下
                    // 以防传递非 promise
            );
};
// 使用
const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = new Promise((resolve, reject) => {
    setTimeout(reject, 1000, 'three');
})
const promises = [p1, p2, p3];
Promise.allSettled(promises).then(console.log)

Promise.allSettled可以看做Promise.all的升级,补齐了Promise.all的部分缺陷

Promise.all的补充知识,当任意一个promise执行失败,promise.all都会被reject,并且 reject 的是第一个抛出的错误信息,只有所有的 promise 都 resolve 时才会调用 .then 中的成功回调;

其中任意一个 promise 被 reject ,Promise.all 就会立即被 reject ,数组中其它未执行完的 promise 依然是在执行的, Promise.all 没有采取任何措施来取消它们的执行;