2 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
是否以及何時(shí)這樣做將是一個(gè)見仁見智的問題,因此這部分對(duì)于 Stack Overflow 來說是題外話。
但具體的問題是:如果你這樣做了,你需要采取什么預(yù)防措施嗎?答案是:是的。您需要捕獲和處理錯(cuò)誤。
考慮這個(gè)返回承諾的即發(fā)即棄異步調(diào)用:
doSomethingAsync();
如果正在做的事情可能失敗,則該承諾可能會(huì)被拒絕。如果它被拒絕并且沒有處理該拒絕,那么:
在瀏覽器中,您會(huì)收到寫入瀏覽器控制臺(tái)的錯(cuò)誤。99.9999999% 的用戶不會(huì)注意到。
在 Node.js 中,您會(huì)將此錯(cuò)誤寫入控制臺(tái):
(節(jié)點(diǎn):26477)[DEP0018] DeprecationWarning:不推薦使用未處理的承諾拒絕。將來,未處理的 Promise 拒絕將使用非零退出代碼終止 Node.js 進(jìn)程。
請(qǐng)注意警告:在某些時(shí)候,Node.js 的未來版本可能會(huì)在您允許未處理的 Promise 拒絕時(shí)開始 *終止進(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沒有附加任何處理程序。沒關(guān)系,只要它永遠(yuǎn)被滿足,而不是被拒絕。沒有任何東西可以滿足這種滿足感。:-)

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)