在JavaScript中的异步函数中捕获所有承诺拒绝

当多个promise在异步函数(javaScript-node v8.4.0)中等待之后抛出拒绝错误时,我遇到了捕获所有错误的问题。

引用下面的javaScript:

作为参考,函数timeoutOne()和timeoutTwo()简单地返回一个本地promise,它分别在1秒和2秒超时后解析值,或者如果将“deviousState”设置为true,则拒绝并显示错误。

let deviousState = true;

async function asyncParallel() {
  try {
    let res1 = timeoutOne();
    let res2 = timeoutTwo();
    console.log(`All done with ${await res1} ${await res2}`)
  }
  catch(err) {
    console.log(err)
  }
}
asyncParallel();

let pAll = Promise.all([timeoutOne(), timeoutTwo()]);
pAll.then((val) => {
  console.log(`All done with ${val[0]} ${val[1]}`)
}).catch(console.log);

在这两种情况下,只有首先返回的承诺会记录一个错误。 我知道在一些承诺库中,有一种方法可以记录所有错误(例如蓝鸟中的“解决”方法),但是,我不确定在本地承诺中是否存在类似于此方法的类似方法?

另外,如果两个承诺都拒绝,则asyncParallel()会在最后拒绝的承诺中记录未捕获的错误。 那是因为没有内置的异步函数try / catch块的机制来以这种方式捕获多个拒绝?

如果承诺解决,一切在两种情况下都是一样的。 它只是当两者都拒绝时,Promise.all处理错误,而异步函数版本声明其中一个未处理的承诺错误会在未来的节点版本中崩溃。

无论如何try / catch来正确处理这种类型的错误? 还是仍然需要在异步函数中使用Promise.all来确保错误得到正确处理?


如果两个承诺都拒绝,则asyncParallel()在最后拒绝的承诺中记录未捕获的错误。

是的 - 您创建了timeoutTwo()承诺但从未处理过错误(如在await使用它)。 该await res2从未因异常执行await res1

(注意它不是“最后拒绝的承诺”,但总是等待的第二个承诺)。

那是因为没有内置的异步函数try / catch块的机制来以这种方式捕获多个拒绝?

在顺序代码中,不能有多个异常,因此提出额外的语法来处理它们将很困难。

我是否还需要在异步函数中使用Promise.all来确保错误得到正确处理?

是的,就是这样。 如果你想同时等待多个承诺,你应该总是使用Promise.allawait关键字仅用于以下.then()调用。

你应该写

async function asyncParallel() {
  try {
    let [val1, val2] = await Promise.all([timeoutOne(), timeoutTwo()]);
    console.log(`All done with ${val1} ${val2}`)
  } catch(err) {
    console.log(err)
  }
}

在这两种情况下,只有首先返回的承诺会记录一个错误。 我知道在一些承诺库中,有一种方法可以记录所有错误(例如蓝鸟中的“解决”方法),但是,我不确定在本地承诺中是否存在类似于此方法的类似方法?

不,没有。 的特点settle是微不足道的使用来实现自己then ,用你想要的任何值:

async function asyncParallel() {
  try {
    let [stat1, stat2] = await Promise.all([
        timeoutOne().then(() => "one fulfilled", () => "one rejected"), 
        timeoutTwo().then(() => "two fulfilled", () => "two rejected")
    ]);
    console.log(`All settled with ${stat1} ${stat2}`)
  } catch(err) {
    console.log(err)
  }
}
链接地址: http://www.djcxy.com/p/55493.html

上一篇: Catching All Promise Rejections in an Async Function in JavaScript

下一篇: Calling async promises inside async promise using .join()