摘要:總而言之,檢查調(diào)用棧是否為空,以及確定把哪個(gè)異步任務(wù)加入調(diào)用棧的這個(gè)過(guò)程就是事件循環(huán),而實(shí)現(xiàn)異步的核心就是事件循環(huán)。
js是一門單線程的語(yǔ)言,不可能進(jìn)行多線程編程,異步編程就是多線程編程一種模式,但是我們經(jīng)常講到j(luò)s的異步編程,其實(shí)是偽異步,因?yàn)樗菃尉€程的,也就是同步,只有前面的代碼執(zhí)行完才能執(zhí)行下面的代碼。所以要理解js中的異步理念,就需要了解js的運(yùn)行核心--事件循環(huán)(Event loop)
為什么js會(huì)有異步呢setTimeout(function(){ //5秒之后執(zhí)行程序 },5000)
我們想象一下,在同步的執(zhí)行上面的代碼,需要等待5秒才能執(zhí)行定時(shí)器中的程序,然后在往下執(zhí)行,在這5秒的過(guò)程中,瀏覽器沒(méi)有任何反應(yīng),出現(xiàn)了阻塞,在用戶體驗(yàn)上很不好。所以異步的模式就出現(xiàn),為了解決瀏覽器非阻塞的運(yùn)行。
單線程如何做到異步js的任務(wù)分為同步和異步兩種,它們的處理方式也不同,同步任務(wù)是直接在主線程上排隊(duì)執(zhí)行,異步任務(wù)則會(huì)被放到事件隊(duì)列中,若有多個(gè)異步任務(wù)則要在事件隊(duì)列中排隊(duì)等待,事件隊(duì)列類似一個(gè)緩沖區(qū),任務(wù)下一步會(huì)被移到調(diào)用棧,然后主線程執(zhí)行調(diào)用棧的任務(wù)。
單線程是指js引擎中負(fù)責(zé)解析執(zhí)行js代碼的線程只有一個(gè)主線程,即每次只能做一件事,而我們知道一個(gè)ajax請(qǐng)求,主線程在等待它響應(yīng)的同時(shí)是會(huì)去做其它事的,瀏覽器先在事件表注冊(cè)ajax的回調(diào)函數(shù),響應(yīng)回來(lái)后回調(diào)函數(shù)被添加到任務(wù)隊(duì)列中等待執(zhí)行,不會(huì)造成線程阻塞,所以說(shuō)js處理ajax請(qǐng)求的方式是異步的。
總而言之,檢查調(diào)用棧是否為空,以及確定把哪個(gè)異步任務(wù)加入調(diào)用棧的這個(gè)過(guò)程就是事件循環(huán),而js實(shí)現(xiàn)異步的核心就是事件循環(huán)。
一次事件循環(huán)的步驟包括:
主線程在執(zhí)行代碼的時(shí)候,遇到異步任務(wù)會(huì)將它添加到一個(gè)事件隊(duì)列中(可以理解為一個(gè)數(shù)組),然后繼續(xù)執(zhí)行下面的代碼,直到同步代碼執(zhí)行完,然后執(zhí)行步驟2
檢查事件隊(duì)列是否為空,非空?qǐng)?zhí)行步驟3,為空則繼續(xù)執(zhí)行步驟2
取出事件隊(duì)列中的第一個(gè)放到調(diào)用棧,然后主線程執(zhí)行調(diào)用棧的任務(wù),再執(zhí)行步驟4
執(zhí)行視圖更新,然后回到步驟2
這就是事件循環(huán)
先看一段代碼,理解一下:(面試題哦)
console.log("start") setTimeout(function() { console.log("setTimeout") }, 0) Promise.resolve().then(function() { console.log("promise1") }).then(function() { console.log("promise2") }) console.log("end")
打印臺(tái)輸出的log順序是什么?結(jié)合上面的步驟分析一下
最后的結(jié)果是:
start end promise1 pormise2 setTimeout參考資料
Event Loop
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/94496.html
摘要:此事件隊(duì)列的美妙之處在于它只是函數(shù)等待被調(diào)用和移動(dòng)到調(diào)用棧的一個(gè)臨時(shí)存放區(qū)域。在事件循環(huán)不斷監(jiān)視調(diào)用棧是否為空現(xiàn)在確實(shí)是空的時(shí)候調(diào)用創(chuàng)建一個(gè)新的調(diào)用棧來(lái)執(zhí)行代碼。在執(zhí)行完之后進(jìn)入了一個(gè)新的狀態(tài)這個(gè)狀態(tài)調(diào)用棧為空事件記錄表為空事件隊(duì)列也為空。 這篇文章是對(duì)個(gè)人認(rèn)為講解 JavaScript 事件循環(huán)比較清楚的一篇英文文章的簡(jiǎn)單翻譯,原文地址是http://altitudelabs.com...
摘要:主線程不斷重復(fù)上面的三步,此過(guò)程也就是常說(shuō)的事件循環(huán)。所以主線程代碼執(zhí)行時(shí)間過(guò)長(zhǎng),會(huì)阻塞事件循環(huán)的執(zhí)行。參考資料這一次,徹底弄懂執(zhí)行機(jī)制任務(wù)隊(duì)列的順序機(jī)制事件循環(huán)搞懂異步事件輪詢與中的事件循環(huán) 1. 說(shuō)明 讀過(guò)本文章后,您能知道: JavaScript代碼在瀏覽器中的執(zhí)行機(jī)制和事件循環(huán) 面試中經(jīng)常遇到的代碼輸出順序問(wèn)題 首先通過(guò)一段代碼來(lái)驗(yàn)證你是否了解代碼輸出順序,如果你不知道輸出...
摘要:而事件循環(huán)是主線程中執(zhí)行棧里的代碼執(zhí)行完畢之后,才開(kāi)始執(zhí)行的。由此產(chǎn)生的異步事件執(zhí)行會(huì)作為任務(wù)隊(duì)列掛在當(dāng)前循環(huán)的末尾執(zhí)行。在下,觀察者基于監(jiān)聽(tīng)事件的完成情況在下基于多線程創(chuàng)建。 主要問(wèn)題: 1、JS引擎是單線程,如何完成事件循環(huán)的? 2、定時(shí)器函數(shù)為什么計(jì)時(shí)不準(zhǔn)確? 3、回調(diào)與異步,有什么聯(lián)系和不同? 4、ES6的事件循環(huán)有什么變化?Node中呢? 5、異步控制有什么難點(diǎn)?有什么解決方...
摘要:概述本篇主要介紹的運(yùn)行機(jī)制單線程事件循環(huán)結(jié)論先在中利用運(yùn)行至完成和非阻塞完成單線程下異步任務(wù)的處理就是先處理主模塊主線程上的同步任務(wù)再處理異步任務(wù)異步任務(wù)使用事件循環(huán)機(jī)制完成調(diào)度涉及的內(nèi)容有單線程事件循環(huán)同步執(zhí)行異步執(zhí)行定時(shí)器的事件循環(huán)開(kāi)始 1.概述 本篇主要介紹JavaScript的運(yùn)行機(jī)制:單線程事件循環(huán)(Event Loop). 結(jié)論先: 在JavaScript中, 利用運(yùn)行至...
摘要:需要注意的是,定時(shí)器比較特殊,并沒(méi)有把回調(diào)函數(shù)掛在事件循環(huán)隊(duì)列中,它所做的就是設(shè)置一個(gè)定時(shí)器,當(dāng)定時(shí)器到時(shí)后,環(huán)境會(huì)把你的回調(diào)函數(shù)放在事件循環(huán)中,這樣,在未來(lái)某個(gè)時(shí)刻的會(huì)被取出執(zhí)行。 Author: bugall Wechat: bugallF Email: 769088641@qq.com Github: https://github.com/bugall 一...
摘要:事件循環(huán)的順序,決定代碼執(zhí)行的順序。輸出第二輪事件循環(huán)正式結(jié)束三第三輪事件循環(huán)第三輪事件循環(huán)從宏任務(wù)開(kāi)始。記為遇到,立即執(zhí)行回調(diào)函數(shù)放入中注冊(cè),然后被分發(fā)到微任務(wù)事件隊(duì)列中。 1、為什么要有事件循環(huán)? 因?yàn)閖s是單線程的,事件循環(huán)是js的執(zhí)行機(jī)制,也是js實(shí)現(xiàn)異步的一種方法。 既然js是單線程,那就像只有一個(gè)窗口的銀行,客戶需要排隊(duì)一個(gè)一個(gè)辦理業(yè)務(wù),同理js任務(wù)也要一個(gè)一個(gè)順序執(zhí)行。如...
閱讀 1269·2019-08-30 12:49
閱讀 3111·2019-08-28 18:14
閱讀 820·2019-08-26 11:38
閱讀 1676·2019-08-23 18:23
閱讀 2822·2019-08-23 17:04
閱讀 500·2019-08-23 16:52
閱讀 4017·2019-08-23 16:43
閱讀 2769·2019-08-23 16:12