Twlig / issuesBlog

MIT License
3 stars 0 forks source link

手写Promise.all #80

Open Twlig opened 2 years ago

Twlig commented 2 years ago

手写Promise.all

查看参考文章后,改进的代码:

var all = function(arr) {
    let result = new Array(arr.length)
    let count = 0 //注意这里通过一个变量取保存它的成功的数量
    return new Promise((resolve, reject) => {
        arr.forEach((item, index) => {
            Promise.resolve(item).then(value => {  //用Promise去包装item,防止item不是Promise无法调用then函数。前面的Promise执行完成才会通过then把执行后的value放入result中
                result[index] = value
                count++
                if(count === arr.length) { //通过conter变量比较,而不是直接通过result.length去判断
                    resolve(result)
                }
            }, err => {
                reject(err)
            })
        })
    })
} 

参考文章代码如下:

var all = (arr) => {
    console.log('my all called');
    let result = new Array(arr.length);
    let counter = 0;//注意这里通过一个变量取保存它的成功的数量
    return new Promise((resolve, reject) => {
        arr.forEach(async (item, index) => {
            let i = index;
            Promice.resolve(item).then(value => { 
                result[i] = value;
                counter ++;
                if (counter === arr.length) {//通过conter变量比较,而不是直接通过result.length去判断
                    resolve(result);
                }
            }).catch(err => {
                reject(err)
            })
        })
    });
}

var p = all([ 
    Promise.resolve(18),
    Promise.reject(5),
    Promise.reject(10),
    Promise.resolve(20),
    Promise.resolve(30)
]); 

/*18
20
30
5
10*/

上面的Promise.all会出现执行顺序的问题,如果都是resolve那没问题,但是如果有一个是reject,那么它的顺序会在所有resolve的后面,这是因为在then中的reject会被后续的catch捕获。过程如下:

参考文章: