在異步函數(shù)中拋異常,很難被捕獲到,
因為異步任務(wù)會放在task queue中,等下一次event loop才被調(diào)用。
(1)try...catch
,在throw
之前try
已經(jīng)執(zhí)行完了
try {
setTimeout(() => {
throw 1;
}, 0);
} catch (e) {
console.log(e);
}
// 報錯:Uncaught 1
(2)在throw
之前,.then()
已經(jīng)執(zhí)行完了
Promise.resolve(1).then(v => {
setTimeout(() => {
throw 1;
}, 0);
}).catch(v => {
console.log(v);
});
// 報錯:Uncaught 1
解決它的一種辦法是,將異常以回調(diào)的方式返回。
asyncFunc((err, data) => {
if(err){
// ...
return;
}
// ...
});