[英]Catching Error in promise with async/await
我正在嘗試使用 async/await 捕獲 promise 內的錯誤,但以下代碼導致“未捕獲的錯誤...”
function messup() {
var promise = new Promise(function(resolve, reject){
setTimeout(function() {
throw new Error("Thrown from messup()");
resolve('hello from messup function');
}, 1000);
});
return promise;
}
async function waitForMe() {
try {
await messup();
}catch(e) {
console.log ('*****Error successfully caught! *****');
}
}
waitForMe()
您從setTimeout
拋出錯誤,而不是從 promise 回調中拋出錯誤。 與任何其他計時器回調一樣,沒有任何東西可以處理該錯誤,它會將 go 直接發送到瀏覽器的主機代碼,這可能會將其轉儲到控制台。
如果您想拒絕您退回的 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;
}
Try-catch 與await
一起使用時專門尋找 promise 被履行或拒絕。
如果你拒絕 promise,而不是拋出一個與承諾的解決方案無關的錯誤(就像你現在一樣),它將通過你當前的設置被捕獲。
需要明確的是,您當前拋出的錯誤不會以任何方式插入到您正在運行的異步操作中。
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 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.