亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不能從異步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 關注
  • 850 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號