面试题——实现PromiseAll函数

1 阅读1分钟

Promise.all的性质快速复习:

接受一个promise数组
返回一个promise实例对象
promise数组中有一个reject时all函数立马返回结果为该reject内容的promise对象,即使其他都resolve或则有其他的reject。
promise数组无错误时,等待promise数组执行完毕才返回包含全部结果数组的promise对象。

实现PromiseAll函数

function promiseAll(promises){
    return new Promise(function(resolve,reject){
        if(!Array.isArray(promises)){
            reject(new Error('no array'))
        }
        let result = [];
        let count = 0;
        let len = promises.length;
        for(let i=0;i<len;i++){
            promises[i].then(function(res){
                result[i] = res
                count++
                if(count===len){
                    resolve(result)
                }
            },function(err){
                reject(err)
            })
        }
    });
}

注解说明

function promiseAll(promises){
    return new Promise(function(resolve,reject){
        // 避免非数组入参,可以增加promise对象类型进一步判断
        if(!Array.isArray(promises)){
            reject(new Error('no array'))
        }
        let result = [];
        let count = 0;
        let len = promises.length;
        // 因为count在then内异步递增,所以count顺序无法控制,需要for循环产生一个序号
        for(let i=0;i<len;i++){
            // 依次编写每个promise的then回调
            promises[i].then(function(res){
                // 收集结果
                result[i] = res
                // count递增不随数组顺序依次完成
                count++
                // 当全部promise执行完成时count也就完成递增,可以判断是否可以resolve
                if(count===len){
                    resolve(result)
                }
            },function(err){
                // then第二个参数可以传入用于reject情况的回调函数
                reject(err)
            })
        }
    });
}

本文章仅供参考,欢迎纠错和建议。