亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于什么時候可以*不*等待異步任務的標準 JS 實踐是什么?

關于什么時候可以*不*等待異步任務的標準 JS 實踐是什么?

Qyouu 2022-11-03 10:32:53
來自 python 異步背景,在 python 中,始終跟蹤異步任務(承諾)非常重要。運行時會為沒有引用的“浮動”異步任務提供錯誤。但是,在 Javascript 中,在某些情況下,只啟動一個異步任務而不等待它,甚至不記住它的 Promise 似乎是完全可以的,例如,如果你不關心它的返回值,只是希望它“稍后”執行.是否有關于何時在瀏覽器或 node.js 中的 JS/TS 中的指南或最佳實踐,只讓異步任務離開而不保留對它的引用是可以接受的?顯然,如果您關心它在主線代碼中的返回值,您必須等待它,同樣,如果您關心在 main 函數完成之前報告錯誤。還有哪些其他情況和注意事項?需要明確的是,我不是在詢問意見,而是在詢問“觸發和忘記”異步任務時要記住的重要事項(如果這是正確的術語)。
查看完整描述

2 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

是否以及何時這樣做將是一個見仁見智的問題,因此這部分對于 Stack Overflow 來說是題外話。


但具體的問題是:如果你這樣做了,你需要采取什么預防措施嗎?答案是:是的。您需要捕獲和處理錯誤。


考慮這個返回承諾的即發即棄異步調用:


doSomethingAsync();

如果正在做的事情可能失敗,則該承諾可能會被拒絕。如果它被拒絕并且沒有處理該拒絕,那么:


在瀏覽器中,您會收到寫入瀏覽器控制臺的錯誤。99.9999999% 的用戶不會注意到。

在 Node.js 中,您會將此錯誤寫入控制臺:

(節點:26477)[DEP0018] DeprecationWarning:不推薦使用未處理的承諾拒絕。將來,未處理的 Promise 拒絕將使用非零退出代碼終止 Node.js 進程。


請注意警告:在某些時候,Node.js 的未來版本可能會在您允許未處理的 Promise 拒絕時開始 *終止進程。


因此,如果您一勞永逸,請務必捕獲錯誤,即使您只是默默地吞下它們:


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...

});

所有的承諾都在那里處理嗎?


不,那很好。


記住這一點then并catch創建并返回一個承諾。上面返回的承諾catch沒有附加任何處理程序。沒關系,只要它永遠被滿足,而不是被拒絕。沒有任何東西可以滿足這種滿足感。:-)


查看完整回答
反對 回復 2022-11-03
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

我想我普遍關心的是,你有處理錯誤的機制嗎?

eslint 有一個no-floating-promises規則,至少強制你添加 a .catch(),我認為這很好。


查看完整回答
反對 回復 2022-11-03
  • 2 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號