首頁 >web前端 >前端問答 >ajax是多執行緒嗎

ajax是多執行緒嗎

青灯夜游
青灯夜游原創
2022-01-19 15:08:292491瀏覽

ajax不是多線程,而是單線程的,因為JavaScript是單線程的,而Ajax屬於JavaScript範疇,因此Ajax是單線程的。之所以可以利用Ajax做到多線程,這取決於Web伺服器,服務端使用多線程處理請求。

ajax是多執行緒嗎

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

Ajax是單執行緒還是多執行緒?

    先明確一點:Ajax是單執行緒的,因為JavaScript是單執行緒的,Ajax屬於JavaScript範疇,因此Ajax是單執行緒的。 之所以我們可以利用Ajax做到多線程,這取決於Web伺服器,服務端使用多線程處理請求。

    然後再明確一點:瀏覽器是多進程的。如圖,google瀏覽器每開啟一個tab標籤頁就會有一個子進程。

    因為JS運行在瀏覽器中,是單線程的,每個window一個JS線程,既然是單線程的,在某個特定的時刻只有特定的程式碼能夠被執行,並阻塞其它的程式碼。

Ajax非同步?

    Ajax請求確實是非同步的,js引擎執行非同步程式碼而不用等待,是因有為有訊息佇列事件循環,這請求是由瀏覽器新開一個線程請求。瀏覽器中很多行為是異步的,當一個非同步事件發生的時候,它就進入事件隊列,瀏覽器有一個內部大消息循環,Event Loop(事件循環),會輪詢大的事件隊列並處理事件,只有前面的處理完畢了,空閒了才會執行這個事件,而JavaScript引擎總是單執行緒執行回呼函數。

結論:

    Ajax請求確實是異步的,這請求是由瀏覽器新開一個線程請求,事件回呼的時候是放入Event loop單線程事件隊列等候處理。

    訊息佇列中放著我們註冊非同步任務時所新增的回呼函數,主執行緒在發起AJAX請求後,會繼續執行其他程式碼。 AJAX執行緒負責請求url,拿到回應後,它會把回應封裝成一個JavaScript對象,然後建構一則訊息:

// ajax请求
$.ajax(url, function(resp) {
    console.log('我是响应:', resp);
});
 
 
// 消息队列中的消息就长这个样子
var message = function () {
    callbackFn(response);
}
// 其中的callbackFn就是前面代码中得到成功响应时的回调函数。

    主執行緒在執行完目前循環中的所有程式碼後,就會到訊息佇列取出這則訊息並執行它,到此為止,就完成了工作執行緒對主執行緒的通知,回呼函數也就執行了。如果一開始主執行緒就沒有提供回呼函數,AJAX線程在收到HTTP回應後,也就沒必要通知主線程,因此也沒必要放訊息到訊息佇列。 其中,非同步過程的回呼函數,一定不在目前這一輪事件循環中執行。

【相關教學推薦:AJAX影片教學

以上是ajax是多執行緒嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn