process.nextTick()process.nextTick()是一個特殊的異步API,他不屬于任何的Event Loop階段 。事實上Node在遇到這個API時,Event Loop根本就不會繼續(xù)進行,會馬上停下來執(zhí)行process.nextTick(),這個執(zhí)行完后才會繼續(xù)Event Loop 。我們寫個例子來看下:
var fs = require('fs')fs.readFile(__filename, () => {setTimeout(() => {console.log('setTimeout');}, 0);setImmediate(() => {console.log('setImmediate');process.nextTick(() => {console.log('nextTick 2');});});process.nextTick(() => {console.log('nextTick 1');});});這段代碼的打印如下:
我們還是來理一下流程:
我們代碼基本都在readFile回調(diào)里面,他自己執(zhí)行時,已經(jīng)在poll階段遇到setTimeout(fn, 0),其實是setTimeout(fn, 1),塞入后面的timers階段遇到setImmediate,塞入后面的check階段遇到nextTick,立馬執(zhí)行,輸出’nextTick 1’到了check階段,輸出’setImmediate’,又遇到個nextTick,立馬輸出’nextTick 2’到了下個timers階段,輸出’setTimeout’
這種機制其實類似于我們前面講的微任務,但是并不完全一樣,比如同時有nextTick和Promise的時候,肯定是nextTick先執(zhí)行,原因是nextTick的隊列比Promise隊列優(yōu)先級更高 。來看個例子:
const promise = Promise.resolve()setImmediate(() => {console.log('setImmediate');});promise.then(()=>{console.log('promise')})process.nextTick(()=>{console.log('nextTick')})代碼運行結(jié)果如下:
總結(jié)本文從異步基本概念出發(fā)一直講到了瀏覽器和Node.js的Event Loop,現(xiàn)在我們再來總結(jié)一下:
JS所謂的“單線程”只是指主線程只有一個,并不是整個運行環(huán)境都是單線程JS的異步靠底層的多線程實現(xiàn)不同的異步API對應不同的實現(xiàn)線程異步線程與主線程通訊靠的是Event Loop異步線程完成任務后將其放入任務隊列主線程不斷輪詢?nèi)蝿贞犃?,拿出任務?zhí)行任務隊列有宏任務隊列和微任務隊列的區(qū)別微任務隊列的優(yōu)先級更高,所有微任務處理完后才會處理宏任務Promise是微任務Node.js的Event Loop跟瀏覽器的Event Loop不一樣,他是分階段的setImmediate和setTimeout(fn, 0)哪個回調(diào)先執(zhí)行,需要看他們本身在哪個階段注冊的,如果在定時器回調(diào)或者I/O回調(diào)里面,setImmediate肯定先執(zhí)行 。如果在最外層或者setImmediate回調(diào)里面,哪個先執(zhí)行取決于當時機器狀況 。process.nextTick不在Event Loop的任何階段,他是一個特殊API,他會立即執(zhí)行,然后才會繼續(xù)執(zhí)行Event Loop
以上關于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 工廠平面圖制作方法 工廠平面設計圖的步驟
- json數(shù)據(jù)自動生成表格方法 json轉(zhuǎn)excel表格工具
- 申請英國讀大學的誤區(qū)有哪些
- 米生小黑蟲怎么辦啊
- 牙膏的保質(zhì)期一般多久
- 類似機車的電動車 適合青少年騎的電動車
- 佛手瓜的皮能吃嗎
- 五花肉腌制方法燒烤
- 抖音文案視頻素材,抖音短視頻的文案怎樣寫
- 牛板筋是牛的哪個部位
