2 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
您是從 Promise 回調(diào)中拋出錯(cuò)誤setTimeout,而不是從 Promise 回調(diào)中拋出錯(cuò)誤。與任何其他計(jì)時(shí)器回調(diào)一樣,沒(méi)有任何東西可以處理該錯(cuò)誤,它將直接進(jìn)入瀏覽器的主機(jī)代碼,這可能會(huì)將其轉(zhuǎn)儲(chǔ)到控制臺(tái)。
如果您想拒絕返回的承諾,請(qǐng)使用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;
}
如果您希望捕獲計(jì)時(shí)器回調(diào)中的任何同步錯(cuò)誤并將其傳遞給reject,您可以使用try/catch來(lái)實(shí)現(xiàn):
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貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
Try-catch 與 一起使用時(shí),await專門尋找要履行或拒絕的承諾。
如果您拒絕承諾,而不是拋出與承諾的解決方案無(wú)關(guān)的錯(cuò)誤(如您目前的情況),它將通過(guò)您當(dāng)前的設(shè)置捕獲。
需要明確的是,您當(dāng)前拋出的錯(cuò)誤不會(huì)以任何方式插入到您正在運(yùn)行的異步操作中。
function messup() {
? ? var promise = new Promise(function(resolve, reject){
? ? ? ? setTimeout(function() {
? ? ? ? ? ? reject("Thrown from messup()"); //<-- do this instead
? ? ? ? }, 1000);
? ? });
? ? return promise;
}
進(jìn)一步閱讀:我在 async/await 指南中詳細(xì)介紹了async/await錯(cuò)誤處理。
添加回答
舉報(bào)