您好,登錄后才能下訂單哦!
nodejs中怎么循環瀏覽器事件,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
瀏覽器中的事件循環:
為了協調事件(event),用戶交互(user interaction),腳本(script),渲染(rendering),網絡(networking)等,用戶代理(user agent)必須使用 事件循環(event loops).
事件:PostMessage(多個頁面通信),MutationObserver(dom監聽)等
用戶交互:click,onScroll等
渲染:解析dom,css等
腳本:執行腳本
nodejs中的事件循環
事件循環允許Node.js執行非阻塞I/O操作,盡管JavaScript是單線程的,通過盡可能將操作卸載到系統內核,由于大多數現代內核都是多線程的,因此 他們可以處理在后臺執行的多個操作。當其中一個操作完成時,內核會告訴Nodejs,以便可以將相應的回調添加到輪詢隊列中以最終執行。
事件:EventEmitter
非阻塞I/O: 網絡請求,文件讀寫等
腳本: js執行腳本
事件循環的本質
在瀏覽器或者nodejs環境中,運行時對js腳本的調度方式就叫事件循環
setTimeout(()=>{ console.log('setTimeout') },0) Promise.resolve().then(() =>{ console.log('promise') }) console.log('main') // main promise setTimeout
javascript為什么是單線程的?
瀏覽器js的作用是操作DOM,這決定了它只能是單線程,否則會帶來很復雜的同步問題。比如,假定javascript同時有兩個線程,一個線程在某個DOM 節點上添加內容,另一個線程刪除了這個節點,這時瀏覽器不知道以哪個線程為主。
任務隊列
單線程意味著所有任務需要排隊,如果因為任務cpu計算量大還好,但是I/O操作cpu是閑著的。所以js就設計成了一門異步語言,不會做無謂的等待。
任務可以分成兩種,一種是同步任務,另一種是異步任務。
所有同步任務都在主線程上執行,形成一個執行棧。
主線程之外,還存在一個任務隊列。只要異步任務有了運行結果,就在任務隊列之中放置一個事件。
一旦執行棧中的所有同步任務執行完畢,系統就會讀取任務隊列,看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。
主線程不斷重復上面的第三步
主線程從任務隊列中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱 Event Loop(事件循環)
宏任務和微任務
除了廣義的同步任務和異步任務,javaScript單線程中的任務可以細分為 宏任務和微任務。
macrotask(宏任務): script(整體代碼),setTimeout, setInterval, setImmediate, I/O, UI rendering
microtask(微任務):process.nextTick, Promise, Object.observe, MutationObserver 1.宏任務進入主線程,執行過程中會搜集微任務加入微任務隊列。 2.宏任務執行完成之后,立馬執行微任務中的任務。微任務執行過程中將再次收集宏任務,并加入宏任務隊列 3.反復執行1,2
事件循環:每執行完一輪宏任務和微任務就叫做一環事件;
一輪事件循環會執行一次宏任務以及所有的微任務
setTimeout(() => { console.log('setTimeout') setTimeout(() => { console.log('setTimeout2') },0) },0) Promise.resolve().then(() =>{ console.log('Promise') Promise.resolve().then(() =>{ console.log('Promise2') }) }) console.log('main') // main promise promise2 setTimeout
任務隊列一定會保持先進先出的順序執行,沒次只能執行一個紅任務!!!·
setTimeout(() => { // 兩個setTimeout誰先進的話 誰就先出 console.log('setTimeout') Promise.resolve().then(() =>{ console.log('promise') }) },0) Promise.resolve().then(() =>{ console.log('promise2') setTimeout(() => { console.log('setTimeout2') },0) }) console.log('main') // main promise2 setTimeout promise setTimeout2
new Promise((res, rej) =>{ console.log(1) res() }).then(() =>{ console.log(2) new Promise((res,rej) =>{ console.log(3) res() }).then(() =>{ console.log(4) }).then(() =>{ console.log(5) }).then(() =>{ console.log(6) }) }).then(() =>{ console.log(7) }) .then(() =>{ console.log(8) }) // 1 2 3 4 7 5 8 6
看完上述內容,你們掌握nodejs中怎么循環瀏覽器事件的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。