前端面试题 - 103. 实现一个Promise.all函数

342 阅读1分钟

接收一个Promise数组,并返回一个新的Promise,当所有Promise都成功时,将其结果以数组形式进行返回;如果有任何一个Promise失败,则立即返回失败的原因。

关键点:返回一个Promise,for循环执行每个Promise,计数和catch判断成功还是失败。

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let completedCount = 0;
    
    // 没有任务
    if(!promises.length) {
        return resolve(results)
    }
    
    promises.forEach((promise, i) => {
        Promise.resolve(promise)
        .then(result => {
            completedCount ++;
            results[i] = result;
            if(completedCount === promises.length) {
               resolve(results);
            }
        })
        .catch(error => {
            reject(error)
        })
    });
  });
}

使用

let p1 = Promise.resolve(1);
let p2 = 2;
let p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 3);
});
let p4 = Promise.reject('出错啦')

promiseAll([ p1, p2, p3 ]).then((res) => {
  console.log(res, 'res---1')
}).catch((err) => {
  console.log('err', err)
})