Promise之Promise.all () --手写

128 阅读2分钟

Promise之Promise.all ()

描述

参考MDN

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

语法

Promise.all(iterable);

Copy to Clipboard

参数

返回值

  • 如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise
  • 如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved)Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise
  • 其它情况下返回一个处理中(pending)的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。

说明

此方法在集合多个 promise 的返回结果时很有用。

完成(Fulfillment): 如果传入的可迭代对象为空,Promise.all 会同步地返回一个已完成(resolved)状态的promise。 如果所有传入的 promise 都变为完成状态,或者传入的可迭代对象内没有 promisePromise.all 返回的 promise 异步地变为完成。 在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组,它包含所有的传入迭代参数对象的值(也包括非 promise 值)。

失败/拒绝(Rejection): 如果传入的 promise 中有一个失败(rejected),Promise.all 异步地将失败的那个结果给失败状态的回调函数,而不管其它 promise 是否完成。

简要的概述一下: 1. 返回一个可迭代的对象, 所有的promise都执行成功, 则返回执行成功的resolved状态的数组,且结果有序, 其中有一个失败rejected ,则全部失败

  1. 因为方法前有一个类名,所以它是一个静态方法在Promise内部 static all()

  2. 返回一个Promise实例

  3. 接收一个可遍历的对象

  4. 任何一个Promise 回调函数不合法就立即抛出错误

function PromiseAll(array) {
    //结果数组
    let result = [];
    //添加标识 看Array里面的值是否都执行完了
    let index = 0
    //返回一个Promise实例
    return new Promise((resolve, reject) => {
        //将返回值添加到数组当中
        function addData(key, value) {
            result[key] = value;
            index++;
            //保证数组中的值都执行完毕了,在把值给resolve出去
            if (index === array.length) {
                resolve(result)
            }
        }

        for (let i = 0; i < array.length; i++) {
            let current = array[i];
            if (current instanceof Promise) {
                //Promise对象
                current.then(value => {
                    addData(i, value)
                }, reason => reject(reason))
            } else {
                //普通值
                addData(i, current)
            }
        }
    })
}


/************** test *****************/
let p1  = new Promise((resolve, reject) =>{
  resolve( 1)
})

let p2  = new Promise((resolve, reject) =>{
  resolve( '测试数据')
})

PromiseAll([1,2,3,4,'44334',p1,p2]).then(res=>{
    console.log(res)
})

//[ 1, 2, 3, 4, '44334', 1, '测试数据' ]