您好,登錄后才能下訂單哦!
javascript是如何實現異步的呢,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
我們知道javascript是單線程的,但是為什么有很多的事件處理卻是異步的呢?javascript的單線程的意思是,只有一個主線程來解釋執行javascript代碼。那么javascript是如何實現異步的呢?
異步的過程
首先,主線程發起一個異步請求,相應的工作線程就接收這個請求并進行處理,期間,主線程發完請求之后就去干別的事情去了。等到工作線程的處理有了結果,瀏覽器內部就分配一個線程出來,通知主線程,剛剛發起的異步請求有了結果(這個通知過程其實是將回調函數推入消息隊列中,也叫事件隊列,也叫任務隊列),等到主線程處理完了當前調用棧中的任務,就會從這個消息隊列中讀取消息,也就是調用回調。這樣就完成了一次讀取消息的循環。
而javascript執行代碼的機制就是不斷地從消息隊列中讀取消息回調并執行的過程。因為每條消息(或者說每個回調)都是由相應的事件(比如鼠標點擊,ajax,定時器事件等)觸發的,所以這個過程稱之為事件循環。
異步的任務
上面把消息推送到事件隊列的這個過程中,如果工作線程處理的任務既有宏任務,也有微任務,則優先處理宏任務,然后把對應宏任務的消息推送到宏任務消息隊列中;然后工作線程再處理微任務,接著把對應微任務的消息推送到微任務的消息隊列中。
注意,宏任務消息隊列與微任務消息隊列不是同一個隊列
當主線程處理完當前調用棧中的任務后,優先從微任務消息隊列中讀取消息,也就是先執行微任務的回調,等到微任務的消息隊列為空,再去讀取宏任務的消息隊列。
注意區分推送順序和讀取順序。
由此,js中的任務分為同步任務和異步任務
同步任務是指:當前主線程將要消化執行的任務,這些任務一起形成執行棧(executioncontextstack)。
異步任務是指:不進入主線程,而是進入任務隊列(taskqueque),即不會馬上進行的任務。
關于javascript是如何實現異步的呢問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。