2 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
是否以及何時(shí)這樣做將是一個(gè)見(jiàn)仁見(jiàn)智的問(wèn)題,因此這部分對(duì)于 Stack Overflow 來(lái)說(shuō)是題外話。
但具體的問(wèn)題是:如果你這樣做了,你需要采取什么預(yù)防措施嗎?答案是:是的。您需要捕獲和處理錯(cuò)誤。
考慮這個(gè)返回承諾的即發(fā)即棄異步調(diào)用:
doSomethingAsync();
如果正在做的事情可能失敗,則該承諾可能會(huì)被拒絕。如果它被拒絕并且沒(méi)有處理該拒絕,那么:
在瀏覽器中,您會(huì)收到寫(xiě)入瀏覽器控制臺(tái)的錯(cuò)誤。99.9999999% 的用戶(hù)不會(huì)注意到。
在 Node.js 中,您會(huì)將此錯(cuò)誤寫(xiě)入控制臺(tái):
(節(jié)點(diǎn):26477)[DEP0018] DeprecationWarning:不推薦使用未處理的承諾拒絕。將來(lái),未處理的 Promise 拒絕將使用非零退出代碼終止 Node.js 進(jìn)程。
請(qǐng)注意警告:在某些時(shí)候,Node.js 的未來(lái)版本可能會(huì)在您允許未處理的 Promise 拒絕時(shí)開(kāi)始 *終止進(jìn)程。
因此,如果您一勞永逸,請(qǐng)務(wù)必捕獲錯(cuò)誤,即使您只是默默地吞下它們:
doSomethingAsync().catch(error => {}); // Obviously only do this if you really don't
// care about the error!
有趣的旁注:在 JavaScript 中,您一直在處理未處理的承諾履行??紤]:
doSomethingAsync()
.then(result => {
// ...do something with result...
})
.catch(error => {
// ...handle/report the error...
});
所有的承諾都在那里處理嗎?
不,那很好。
記住這一點(diǎn)then并catch創(chuàng)建并返回一個(gè)承諾。上面返回的承諾catch沒(méi)有附加任何處理程序。沒(méi)關(guān)系,只要它永遠(yuǎn)被滿足,而不是被拒絕。沒(méi)有任何東西可以滿足這種滿足感。:-)

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
我想我普遍關(guān)心的是,你有處理錯(cuò)誤的機(jī)制嗎?
eslint 有一個(gè)no-floating-promises
規(guī)則,至少?gòu)?qiáng)制你添加 a .catch()
,我認(rèn)為這很好。
添加回答
舉報(bào)