让Promise.all(p1,p2,p3)在p1为reject的情况下等待所有promise完成,且最终返回reject?

题目描述

执行promise.all(p1,p2,p3);
p1延迟100ms,p2延迟1000ms,p3延迟1500ms
p1为reject,p2、p3为resolve;
假设promises = [p1, p2, p3]

代码

function waitForAll(...promises){
return Promise.all(promises);
}

你期待的结果是什么?实际看到的错误信息又是什么?

修改代码,函数最终返回reject,且执行总时长大于等于1500ms

阅读 2.1k
2 个回答
'use strict'

let p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log("in p1");
        reject("p1")
    }, 1000);
});

let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log("in p2");
        resolve("p2")
    }, 2000);
});
let p3 = new Promise((resolve, reject) => {
    setTimeout(() => {
        console.log("in p3");
        resolve("p3")
    }, 3000);
});

function waitForAll(...promises) {
    let arr_reject = [];
    let arr_p = [];
    let i = 0;
    for (let p of promises) {
        let idx = i;
        arr_reject.push(false);
        // 使用 new Promise().catch ,而不是直接 p.catch
        // 可以接接受不是 Promise 的 p
        // 如果保证输入全部为 Promise, 可以直接用 p.catch
        arr_p.push(new Promise(resolve => resolve(p)).catch(err => { arr_reject[idx] = true; return err; }));
        i++;
    }
    return Promise.all(arr_p).then(vals => {
        let idx_rej = arr_reject.indexOf(true);
        if (idx_rej >= 0) {
            throw vals[idx_rej];
        } else {
            return vals;
        }
    });
}

waitForAll(p3, p1, p2).then(vals => {
    console.log("fullfilled");
    console.log(vals);
}, err => {
    console.log("reject");
    console.log(err);
})

基本思路,catch() 所有 reject ,并记录,同时 resolve。
然后,等所有 Promise resolve 之后,检查是否有 Promise reject ,如果有,那么 reject(通过 throw)。

Promise.allSettled() 了解一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题