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被調用時,該返回值將被忽略。
添加回答
舉報
0/150
提交
取消