3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
使用一個(gè)相對(duì)于另一個(gè)沒(méi)有優(yōu)勢(shì),但是,在特定情況下throw無(wú)法使用。但是,這些情況可以解決。
每當(dāng)您進(jìn)入promise回調(diào)時(shí),都可以使用throw。但是,如果您在任何其他異步回調(diào)中,則必須使用reject。
例如,這不會(huì)觸發(fā)捕獲:
new Promise(function() {
setTimeout(function() {
throw 'or nah';
// return Promise.reject('or nah'); also won't work
}, 1000);
}).catch(function(e) {
console.log(e); // doesn't happen
});
相反,您將面臨未解決的承諾和未捕獲的異常。在這種情況下,您可能會(huì)改為使用reject。但是,您可以通過(guò)通知超時(shí)來(lái)解決此問(wèn)題:
function timeout(duration) { // Thanks joews
return new Promise(function(resolve) {
setTimeout(resolve, duration);
});
}
timeout(1000).then(function() {
throw 'worky!';
// return Promise.reject('worky'); also works
}).catch(function(e) {
console.log(e); // 'worky!'
});

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
另一個(gè)重要的事實(shí)是,reject() DOES NOT像終止控制流return語(yǔ)句一樣。相反,throw確實(shí)終止了控制流。
例:
new Promise((resolve, reject) => {
throw "err";
console.log("NEVER REACHED");
})
.then(() => console.log("RESOLVED"))
.catch(() => console.log("REJECTED"));
與
new Promise((resolve, reject) => {
reject(); // resolve() behaves similarly
console.log("ALWAYS REACHED"); // "REJECTED" will print AFTER this
})
.then(() => console.log("RESOLVED"))
.catch(() => console.log("REJECTED"));

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
是的,最大的不同是拒絕是一個(gè)在承諾被拒絕后執(zhí)行的回調(diào)函數(shù),而throw不能異步使用。如果您選擇使用拒絕,您的代碼將繼續(xù)以異步方式正常運(yùn)行,而throw將優(yōu)先完成解析器功能(此功能將立即運(yùn)行)。
我見(jiàn)過(guò)的一個(gè)可以幫助我弄清楚問(wèn)題的示例是,您可以設(shè)置帶有拒絕的Timeout函數(shù),例如:
new Promise(_, reject) {
setTimeout(reject, 3000);
});
上面不可能用throw編寫(xiě)。
在您的小示例中,兩者之間的區(qū)別難以區(qū)分,但是當(dāng)處理更復(fù)雜的異步概念時(shí),兩者之間的區(qū)別可能會(huì)非常大。
添加回答
舉報(bào)