溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

javascript是如何實現(xiàn)異步的呢

發(fā)布時間:2021-09-30 15:34:34 來源:億速云 閱讀:145 作者:柒染 欄目:開發(fā)技術(shù)

javascript是如何實現(xiàn)異步的呢,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

  我們知道javascript是單線程的,但是為什么有很多的事件處理卻是異步的呢?javascript的單線程的意思是,只有一個主線程來解釋執(zhí)行javascript代碼。那么javascript是如何實現(xiàn)異步的呢?

  異步的過程

  首先,主線程發(fā)起一個異步請求,相應(yīng)的工作線程就接收這個請求并進行處理,期間,主線程發(fā)完請求之后就去干別的事情去了。等到工作線程的處理有了結(jié)果,瀏覽器內(nèi)部就分配一個線程出來,通知主線程,剛剛發(fā)起的異步請求有了結(jié)果(這個通知過程其實是將回調(diào)函數(shù)推入消息隊列中,也叫事件隊列,也叫任務(wù)隊列),等到主線程處理完了當(dāng)前調(diào)用棧中的任務(wù),就會從這個消息隊列中讀取消息,也就是調(diào)用回調(diào)。這樣就完成了一次讀取消息的循環(huán)。

  而javascript執(zhí)行代碼的機制就是不斷地從消息隊列中讀取消息回調(diào)并執(zhí)行的過程。因為每條消息(或者說每個回調(diào))都是由相應(yīng)的事件(比如鼠標(biāo)點擊,ajax,定時器事件等)觸發(fā)的,所以這個過程稱之為事件循環(huán)。

  異步的任務(wù)

  上面把消息推送到事件隊列的這個過程中,如果工作線程處理的任務(wù)既有宏任務(wù),也有微任務(wù),則優(yōu)先處理宏任務(wù),然后把對應(yīng)宏任務(wù)的消息推送到宏任務(wù)消息隊列中;然后工作線程再處理微任務(wù),接著把對應(yīng)微任務(wù)的消息推送到微任務(wù)的消息隊列中。

  注意,宏任務(wù)消息隊列與微任務(wù)消息隊列不是同一個隊列

  當(dāng)主線程處理完當(dāng)前調(diào)用棧中的任務(wù)后,優(yōu)先從微任務(wù)消息隊列中讀取消息,也就是先執(zhí)行微任務(wù)的回調(diào),等到微任務(wù)的消息隊列為空,再去讀取宏任務(wù)的消息隊列。

  注意區(qū)分推送順序和讀取順序。

  由此,js中的任務(wù)分為同步任務(wù)和異步任務(wù)

  同步任務(wù)是指:當(dāng)前主線程將要消化執(zhí)行的任務(wù),這些任務(wù)一起形成執(zhí)行棧(executioncontextstack)。

  異步任務(wù)是指:不進入主線程,而是進入任務(wù)隊列(taskqueque),即不會馬上進行的任務(wù)。

關(guān)于javascript是如何實現(xiàn)異步的呢問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI