2 回答

TA貢獻1799條經驗 獲得超9個贊
您是從 Promise 回調中拋出錯誤setTimeout,而不是從 Promise 回調中拋出錯誤。與任何其他計時器回調一樣,沒有任何東西可以處理該錯誤,它將直接進入瀏覽器的主機代碼,這可能會將其轉儲到控制臺。
如果您想拒絕返回的承諾,請使用reject:
function messup() {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
reject(new Error("Thrown from messup()"));
resolve('hello from messup function'); // This line is pointless now
}, 1000);
});
return promise;
}
如果您希望捕獲計時器回調中的任何同步錯誤并將其傳遞給reject,您可以使用try/catch來實現:
function messup() {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
try {
throw new Error("Thrown from messup()");
resolve('hello from messup function'); // This line will never be reached
} catch (e) {
reject(e);
}
}, 1000);
});
return promise;
}

TA貢獻1856條經驗 獲得超11個贊
Try-catch 與 一起使用時,await專門尋找要履行或拒絕的承諾。
如果您拒絕承諾,而不是拋出與承諾的解決方案無關的錯誤(如您目前的情況),它將通過您當前的設置捕獲。
需要明確的是,您當前拋出的錯誤不會以任何方式插入到您正在運行的異步操作中。
function messup() {
? ? var promise = new Promise(function(resolve, reject){
? ? ? ? setTimeout(function() {
? ? ? ? ? ? reject("Thrown from messup()"); //<-- do this instead
? ? ? ? }, 1000);
? ? });
? ? return promise;
}
進一步閱讀:我在 async/await 指南中詳細介紹了async/await錯誤處理。
添加回答
舉報