Pomise之Promise.allSettled()

134 阅读2分钟

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 可能更合适。

  1. 手写实现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);
    });