1 回答

TA貢獻1812條經驗 獲得超5個贊
根據@ThisIsNoZaku 的鏈接,Javascript 有一個“運行到完成”原則:
在處理任何其他消息之前,每條消息都會被完全處理。
這在推理您的程序時提供了一些很好的屬性,包括這樣一個事實:每當一個函數運行時,它不能被搶占并且將在任何其他代碼運行之前完全運行(并且可以修改函數操作的數據)。這與 C 不同,例如,如果一個函數在一個線程中運行,它可能會在任何時候被運行時系統停止以在另一個線程中運行一些其他代碼。
此模型的一個缺點是,如果一條消息需要很長時間才能完成,Web 應用程序將無法處理用戶交互,例如單擊或滾動。瀏覽器通過“腳本運行時間過長”對話框來緩解這種情況。一個好的做法是縮短消息處理時間,如果可能的話,將一條消息縮減為多條消息。
進一步閱讀:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
因此對于:
示例 A:這作為站點計數器非常有效。
示例 B:這也可以正常工作,但是如果同時發生許多請求,那么最后提交的請求將等待相當長的時間。
\remove
示例 C:如果在完成之前發送另一個調用someAsyncFunction
,那么您的數組完全有可能無效。解決這個問題的方法是將索引結果移動到.then
async 函數的子句中。
IMO,以延遲為代價,解決了許多潛在的痛苦并發問題。如果您必須優化請求的速度,那么我的建議是研究不同的架構(附加緩存等)。
添加回答
舉報