2016-02-06 46 views
2

我知道JavaScript在單線程上運行。我也知道,當我們使用jquery進行異步ajax調用時,代碼不會停止並繼續連續執行。響應由回調處理。我的問題是單線程如何做到這一點? 線程是否處理回調&當我們得到迴應時,停止進一步的代碼執行?單線程如何處理JavaScript中的異步代碼

+0

對此[這裏](https://stackoverflow.com/a/7575649/712526)有一個非常好的答案,其中包含很多參考資料。 – jpaugh

回答

4

不,它不會停止代碼執行。

回調排隊,當沒有別的東西要執行時,它將會運行。

沒有兩件事情在同一時間發生,並且調度不是先發制人。

所以,如果你讓你的單線程忙於無限循環等事情,回調將永遠不會有機會運行。

+0

你什麼意思是'沒有別的事情'?當它恰好有機會運行?你能用一個例子來解釋嗎? :)) –

+0

有一個事件循環(單線程)運行需要運行的所有腳本。所有回調都在排隊,並且會一個接一個地運行。如果您將無限循環放入其中一個函數中,則該函數將永遠不會結束,並且控件不會返回到事件循環。結果,隊列不再得到處理,系統掛起。 – Thilo

1

瀏覽器管理事件隊列。當發生事件時(例如來自Ajax調用,定時器觸發或鼠標或觸摸事件的響應),當主線程處於空閒狀態時,正在調用相應的回調。

0

這並非如實,它取決於您是使用Node還是瀏覽器,哪個瀏覽器,但它是一個好的心智模型。

JavaScript正在鋪設另一種語言,比如多線程的C語言。當JavaScript運行ajaxs請求時,它會將請求添加到隊列中,並且構建用於處理網絡請求的語言將執行此操作。請求完成後,它會更改隊列中的值。 每個處理週期後,JavaScript將檢查此隊列並運行鏈接到已完成任務的任何回調。所以JavaScript不會執行這個過程本身,而只是在它們完成時進行檢查。

相關問題