Promise.allSettled()
描述
参考MDN developer.mozilla.org/zh-CN/docs/…
Promise.allSettled(iterable)
参数
iterable 一个以 promise 组成的可迭代(例如 Array)对象。
返回值 一个 Promise,如下:
已经兑现,如果传递的 iterable 是空的。 异步兑现,当给定的 iterable 中所有 promise 已经敲定时(要么已兑现,要么已拒绝)。兑现的值是一个对象数组,其中的对象按照 iterable 中 promise 传递的顺序,描述每一个 promise 的结果,无论完成顺序如何。每个结果对象都有以下的属性: status 一个字符串,要么是 "fulfilled",要么是 "rejected",表示 promise 的最终状态。
value 仅当 status 为 "fulfilled",才存在。在 promise 兑现时才有 value。
reason 仅当 status 为 "rejected",才存在,在 promsie 拒绝时才有 reason。
如果 iterable 传递的不是空的,但包含未响应的 promise,则返回的 promise 仍然异步(而不是同步)兑现。 描述 Promise.allSettled() 方法是 promise 并发性方法的其中之一。在你有多个不依赖于彼此成功完成的异步任务时,或者你总是想知道每个 promise 的结果时,使用 Promise.allSettled() 。
相比之下,如果任务相互依赖,或者如果你想立即拒绝其中任何任务,Promise.all() 返回的 Promise 可能更合适。
-
手写实现Promise.allSettled
/** * 1.手写实现Promise.allSettled() * 2. 接受参数为数组,每一个数组成员都是Promise对象 * 3. 方法返回的 Promise 实例终值也是一个数组,顺序同 promise 输入顺序, * 4.其中每个成员在输入 promise 为 resolved 状态时为 {status:'fulfilled', value:同一个终值}, * 5. rejected 状态时为 {status:'rejected', reason:同一个拒因}。 */ function PromiseAllSettled(array) { if (array.length === 0) return Promise.resolve([]); let index = 0; //index == array.length表示执行完毕 let result = []; let len = array.length; return new Promise((resolve, reject) => { for (let i = 0; i < array.length; i++) { let current = array[i]; Promise.resolve(current).then(res => { result[i] = {status: 'fulfilled', value: res}; }).catch(reason=>{ result[i] = {status: 'rejected', value: reason} }).finally(()=>{ //最后执行完毕,判断计数是否等于传递进来的参数的个数 index++ if(index === array.length) { resolve(result); } }) } }) } //测试一下allSettled let p1 = Promise.resolve(2); let p2 = Promise.resolve(3); let p3 = Promise.reject("执行失败"); PromiseAllSettled([p1, p2, p3]).then(res => { console.log(res); });