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ù)隊列),等到主線程處理完了當前調(diào)用棧中的任務(wù),就會從這個消息隊列中讀取消息,也就是調(diào)用回調(diào)。這樣就完成了一次讀取消息的循環(huán)。
而javascript執(zhí)行代碼的機制就是不斷地從消息隊列中讀取消息回調(diào)并執(zhí)行的過程。因為每條消息(或者說每個回調(diào))都是由相應(yīng)的事件(比如鼠標點擊,ajax,定時器事件等)觸發(fā)的,所以這個過程稱之為事件循環(huán)。
異步的任務(wù)
上面把消息推送到事件隊列的這個過程中,如果工作線程處理的任務(wù)既有宏任務(wù),也有微任務(wù),則優(yōu)先處理宏任務(wù),然后把對應(yīng)宏任務(wù)的消息推送到宏任務(wù)消息隊列中;然后工作線程再處理微任務(wù),接著把對應(yīng)微任務(wù)的消息推送到微任務(wù)的消息隊列中。
注意,宏任務(wù)消息隊列與微任務(wù)消息隊列不是同一個隊列
當主線程處理完當前調(diào)用棧中的任務(wù)后,優(yōu)先從微任務(wù)消息隊列中讀取消息,也就是先執(zhí)行微任務(wù)的回調(diào),等到微任務(wù)的消息隊列為空,再去讀取宏任務(wù)的消息隊列。
注意區(qū)分推送順序和讀取順序。
由此,js中的任務(wù)分為同步任務(wù)和異步任務(wù)
同步任務(wù)是指:當前主線程將要消化執(zhí)行的任務(wù),這些任務(wù)一起形成執(zhí)行棧(executioncontextstack)。
異步任務(wù)是指:不進入主線程,而是進入任務(wù)隊列(taskqueque),即不會馬上進行的任務(wù)。
關(guān)于javascript是如何實現(xiàn)異步的呢問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
                本文題目:javascript是如何實現(xiàn)異步的呢-創(chuàng)新互聯(lián)
                
                文章源于:http://www.yijiale78.com/article36/ddcgsg.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、自適應(yīng)網(wǎng)站、服務(wù)器托管、網(wǎng)頁設(shè)計公司、電子商務(wù)、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
