Promise.all中的错误处理类似于async/await语法中的流

Smi*_*row 9 javascript asynchronous node.js async-await

我有一些问题要处理"并行"中的多次拒绝.当我们"等待并行"时,如何处理异步函数中的拒绝.
这是一个例子:

function in_2_sec(number) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject('Error ' + number);
        }, 2000);
    }) 
}

async function f1() {
    try {
        let a = in_2_sec(3);
        let b = in_2_sec(30);
        return await a + await b; // awaiting in "parallel"
    } catch(err) {
        console.log('Error', err);
        return false;
    }
}

async function f2() {
    try {
        let a = await Promise.all([in_2_sec(3), in_2_sec(30)]);
        return a[0] + a[1];
    } catch(err) {
        console.log('Error', err);
        return false;
    }
}

// f1().then(console.log) // UnhandledPromiseRejectionWarning
// f2().then(console.log) // Nice
Run Code Online (Sandbox Code Playgroud)


f1()创建一个UnhandledPromiseRejectionWarningin节点,因为没有处理第二次拒绝(b).
f2()完美的工作,Promise.all()诀窍,但如何f2()只用async/await语法,没有Promise.all()

Ber*_*rgi 6

f2()完美的工作,Promise.all()诀窍,但如何f2()只用async/await语法,没有Promise.all()

一点也不.Promise.all!这就是它的目的.不要想到async/ await取代承诺 - 你仍在使用它们,它只是then电话的语法糖.没有句法替代Promise.all.

当然,也可以重新实现Promise.all自己的行为(依赖于Promise构造函数和.then原语),但你真的不想这样做(存在太多陷阱).