我知道JavaScript在單線程上運行。我也知道,當我們使用jquery進行異步ajax調用時,代碼不會停止並繼續連續執行。響應由回調處理。我的問題是單線程如何做到這一點? 線程是否處理回調&當我們得到迴應時,停止進一步的代碼執行?單線程如何處理JavaScript中的異步代碼
回答
不,它不會停止代碼執行。
回調排隊,當沒有別的東西要執行時,它將會運行。
沒有兩件事情在同一時間發生,並且調度不是先發制人。
所以,如果你讓你的單線程忙於無限循環等事情,回調將永遠不會有機會運行。
你什麼意思是'沒有別的事情'?當它恰好有機會運行?你能用一個例子來解釋嗎? :)) –
有一個事件循環(單線程)運行需要運行的所有腳本。所有回調都在排隊,並且會一個接一個地運行。如果您將無限循環放入其中一個函數中,則該函數將永遠不會結束,並且控件不會返回到事件循環。結果,隊列不再得到處理,系統掛起。 – Thilo
瀏覽器管理事件隊列。當發生事件時(例如來自Ajax調用,定時器觸發或鼠標或觸摸事件的響應),當主線程處於空閒狀態時,正在調用相應的回調。
這並非如實,它取決於您是使用Node還是瀏覽器,哪個瀏覽器,但它是一個好的心智模型。
JavaScript正在鋪設另一種語言,比如多線程的C語言。當JavaScript運行ajaxs請求時,它會將請求添加到隊列中,並且構建用於處理網絡請求的語言將執行此操作。請求完成後,它會更改隊列中的值。 每個處理週期後,JavaScript將檢查此隊列並運行鏈接到已完成任務的任何回調。所以JavaScript不會執行這個過程本身,而只是在它們完成時進行檢查。
- 1. 如何處理異步麪條代碼?
- 2. QNetworkAccessManager處理異步線程
- 3. 如何處理javascript的異步性質?
- 4. 如何處理Meteor.js中的異步代碼Accounts.registerLoginHandler
- 5. 如何處理異常處理代碼中的異常?
- 6. 控制PyQt中的異步線程 - 多線程或多處理?
- 7. 長處理線程異步ASP.NET網頁
- 8. 線程與異步圖像處理?
- 9. Clojure消息處理/異步,多線程
- 10. 在應用程序框架中處理異步JavaScript代碼的最佳做法
- 11. 具有單核處理器和多核處理器的單線程代碼的多線程代碼
- 12. 如何在Python中使用單獨的線程進行異步信號處理
- 13. 如何處理來自非UI線程的異步SQL查詢
- 14. javascript中事件處理程序的異步或同步調用
- 15. 登錄多線程異步代碼
- 16. 如何管理JavaScript中複雜的異步處理?
- 17. 如何在ASP.NET中處理未處理的線程異常?
- 18. 如何處理外部DLL中單獨線程上的異常?
- 19. 如何將Python線程代碼轉換爲多處理代碼?
- 20. 如何按順序處理異步代碼
- 21. Roslyn Analyzer應該如何處理異步代碼?
- 22. 使用單線程進行異步處理
- 23. 偶處理程序代碼塊中未處理的異常
- 24. 如何處理ngOnChanges中的異步
- 25. 瞭解異步Javascript代碼
- 26. 如何處理單個catch塊中工作線程和主線程的異常?
- 27. 如何正確處理多線程/異步應用程序中的對象?
- 28. 如何處理線程函數中的重複代碼?
- 29. 如何處理骨幹牽線木偶初始化程序中的異步代碼
- 30. 不同處理器上多線程代碼的時間差異?
對此[這裏](https://stackoverflow.com/a/7575649/712526)有一個非常好的答案,其中包含很多參考資料。 – jpaugh