鍍金池/ 問答/HTML/ js異步任務(wù)從開始執(zhí)行到調(diào)用回調(diào)函數(shù)這段時間放到哪邊了?

js異步任務(wù)從開始執(zhí)行到調(diào)用回調(diào)函數(shù)這段時間放到哪邊了?

最近在研究event loop,看了不少前輩們的文章,前輩們都說主線程在執(zhí)行異步任務(wù)時,先發(fā)起調(diào)用,然后把它掛起,等他有返回值了放到任務(wù)隊列里等待主線程調(diào)用回調(diào)函數(shù)獲取返回值。
但是,我不明白怎么個掛起法?掛起時主線程執(zhí)行別的任務(wù)了,被掛起的異步任務(wù)在干嘛?在哪里?
比如ajax請求,接收服務(wù)器傳過來的數(shù)據(jù)時不需要線程運行它嗎?
有沒有老哥知道的?求解。

回答
編輯回答
卟乖
  1. 主線程在執(zhí)行到異步調(diào)用時,將異步的代碼掛在瀏覽器內(nèi)核提供的異步線程去執(zhí)行,而主線程繼續(xù)執(zhí)行同步代碼。
  2. 異步線程執(zhí)行完成后將回調(diào)放在消息隊列中。
  3. 主線程通在消息隊列中通過事件循環(huán)從消息隊列中取出異步的回調(diào)再去執(zhí)行。

比如ajax請求。
js引擎執(zhí)行到ajax請求時,由瀏覽器新開線程來執(zhí)行這個XMLHttpRequest,而js引擎提供的主線程,會去消息隊列中循環(huán)查找回調(diào)來執(zhí)行。

基于個人理解答題,如有錯誤請直接指出,不吝賜教。

2017年12月14日 02:35
編輯回答
默念

這里應(yīng)該涉及到一個“事件觸發(fā)線程”的概念。
推薦閱讀從瀏覽器多進程到JS單線程,JS運行機制最全面的一次梳理
可能可以解決你的疑惑。

2017年10月13日 04:30