Promise之Promise.any()

116 阅读3分钟

Promise.any()

描述

参考MDN

developer.mozilla.org/zh-CN/docs/…

Promise.any(iterable);

参数

返回值

  • 如果传入了一个空的可迭代对象,那么就会返回一个已经被拒的 promise
  • 如果传入了一个不含有 promise 的可迭代对象,那么就会返回一个异步兑现的 promise
  • 其余情况下都会返回一个处于等待状态的 promise。如果可迭代对象中的任意一个 promise 兑现了,那么这个处于等待状态的 promise 就会异步地(调用栈为空时)切换至兑现状态。如果可迭代对象中的所有 promise 都被拒绝了,那么这个处于等待状态的 promise 就会异步地切换至被拒状态。

说明

该方法用于获取首个兑现的 promise 的值。只要有一个 promise 兑现了,那么此方法就会提前结束,而不会继续等待其他的 promise 全部敲定。

不像 Promise.all() 会返回一组兑现值那样,我们只能得到一个兑现值(假设至少有一个 promise 兑现)。当我们只需要一个 promise 兑现,而不关心是哪一个兑现时此方法很有用的。

同时,也不像 Promise.race() 总是返回第一个敲定值(兑现或拒绝)那样,这个方法返回的是第一个兑现的值。这个方法将会忽略掉所有的被拒绝的 promise,直到第一个 promise 兑现。

兑现(Fulfillment)

该方法所返回的 promise 会以可迭代对象内首个兑现的 promise 的兑现值来作为它自己的兑现值,或者会以可迭代对象内首个非 promise 值来作为它自己的兑现值,该方法不会关心其他的 promise 是兑现了还是被拒了。

  • 如果传入的可迭代对象是非空的,那么当可迭代对象内的任意一个 promise 兑现后,或者当可迭代对象内存在非 promise 值时,该方法所返回的 promise 都会异步的变成兑现状态。

拒绝(Rejection)

如果可迭代对象内所有的 promises 都被拒绝了,那么该方法所返回的 promise 就会异步的切换至被拒状态,并用一个 AggregateError(继承自 Error)实例来作为它的拒因。它包含一个 errors 属性,该属性是一个用于存储拒因的数组。

  • 如果传入了一个空的可迭代数组,那么该方法就会返回一个已经被拒 promise,其拒因是一个 AggregateError 实例,该实例的 errors 属性会是一个空数组。
  1. 手写实现Promise

    /**
     * 1.返回一个Promise, 一旦某一个Promise执行成功,就立即返回, 全部执行失败,才返回reject
     */
    
    function PromiseAny(array) {
        //reject 记录
        let index = 0
        let result = []
        return new Promise((resolve, reject) => {
            for (let i = 0; i < array.length; i++) {
                let current = array[i];
                if (current instanceof Promise) {
                    Promise.resolve(array[i]).then(res => {
                        resolve(res)
                    }).catch(err => {
                        index++; //失败累计加1
                        result.push(err);
                        if (index === result.length) {
                            reject(result);
                        }
                    })
    
                } else {
                    //立即返回
                    resolve(current)
                }
    
            }
        })
    }
    
    
    
    
    let p1 = Promise.reject('1');
    let p2 = Promise.reject("1");
    let p3 = Promise.reject("2");
    let p4 = Promise.reject("2");
    
    let array = [p1,p2,p3,p4];
    
    PromiseAny(array).then(res=>{
        console.log(res);
    })