小编典典

不能从异步Promise执行器函数中引发错误

node.js

我一直在试图从概念上理解以下代码为何无法捕获throw。如果asyncnew Promise(async (resolve, ...零件中删除关键字,则它可以正常工作,因此它与Promise执行程序是异步函数这一事实有关。

(async function() {

  try {
    await fn();
  } catch(e) {
    console.log("CAUGHT fn error -->",e)
  }

})();

function fn() {

  return new Promise(async (resolve, reject) => {
    // ...
    throw new Error("<<fn error>>");
    // ...
  });

}

答案重复为:“如果您在任何其他异步回调中,则必须使用reject”,但是通过“异步”,它们不是在引用async函数,因此,我认为它们的解释在此处不适用(如果他们这样做,我不知道怎么做。

如果代替throw我们使用reject,上述代码可以正常工作。我想 从根本 上理解为什么throw在这里不起作用。谢谢!


阅读 263

收藏
2020-07-07

共1个答案

小编典典

这是Promise构造函数antipattern的async
/ await版本!

从来没有过使用asyncfunction作为一个Promise执行程序功能(即使你可以把它工作1)!

[1:通过调用resolvereject不是使用returnand throw语句]

通过“异步”他们不是指async功能,所以我认为他们的解释在这里不适用

他们也可以。一个简单的例子就 不能 工作

new Promise(async function() {
    await delay(…);
    throw new Error(…);
})

相当于

new Promise(function() {
    return delay(…).then(function() {
        throw new Error(…);
    });
})

现在清楚的throw是,它位于异步回调中。

Promise构造也只能望尘莫及 _同步_异常,和一个async function 不会抛出
-它总是会返回一个承诺(这可能会遭到拒绝,虽然)。当promise正在等待resolve被调用时,该返回值将被忽略。

2020-07-07