亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

js的settimeout方法 settimeout函數(shù)用法( 五 )


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)容,希望對您有所幫助: