为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2019-12-06 12:39:21
我一直在试图从概念上理解以下代码为何无法捕获throw。如果async从new 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在这里不起作用。谢谢!
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

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


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


[1:通过调用resolve而reject不是使用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被调用时,该返回值将被忽略。


查看完整回答
反对 回复 2019-12-06
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您实际上可以做的更短:return delay(…).then(function() { throw new Error(…); }); 

查看完整回答
反对 回复 2019-12-06
  • 2 回答
  • 0 关注
  • 801 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信