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

时间:2017-04-23 08:13:06

标签: javascript node.js asynchronous async-await

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

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


f1()在节点中创建UnhandledPromiseRejectionWarning,因为未处理第二次拒绝(b)。
f2()完美无缺,Promise.all()可以解决问题,但是如何在没有f2()的情况下使用async / await语法创建Promise.all()

2 个答案:

答案 0 :(得分:6)

  

f2()效果很好,Promise.all()可以解决这个问题,但是如何在没有f2()的情况下使用async / await语法制作Promise.all()

完全没有。 使用Promise.all这就是它的用途。不要想到替换承诺的async / await - 你仍在使用它们,它只是then次呼叫的语法糖。 Promise.all没有句法替代。

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

答案 1 :(得分:3)

我能想到的最简单的事情,我不喜欢它,就是在错误路径中对catch进行无条件调用,可能是实用函数。

使用这些实用功能:

function noop() {
}

function markHandled(...promises) {
    promises.forEach(p => p && p.catch(noop));
}

它' S:

async function f2() {
    let a, b;
    try {
        a = in_2_sec(3);
        b = in_2_sec(30);
        return await a + await b;
    } catch(err) {
        console.log('Error', err);
        markHandled(a, b);
        return false;
    }
}

这样,我们明确地忽略了我们不关心的拒绝,并发现了主要错误。

示例:



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

function noop() {
}

function markHandled(...promises) {
    promises.forEach(p => p && p.catch(noop));
}

async function f2() {
    let a, b;
    try {
        a = in_2_sec(3);
        b = in_2_sec(30);
        return await a + await b;
    } catch(err) {
        console.log('Error', err);
        markHandled(a, b);
        return false;
    }
}

f2().then(console.log);