setTimeout和setImmediate以及process.nextTick的区别
《第二屆阿里巴巴前端練習(xí)生計(jì)劃線上筆試》考試
setTimeout和setImmediate以及process.nextTick的區(qū)別
SetTimeOut
setTimeout和setInterval函數(shù)執(zhí)行順序相似,需要注意的是,setTimeout()只是將事件插入了"任務(wù)隊(duì)列",必須等到執(zhí)行棧執(zhí)行完,主線程才會去執(zhí)行它指定的回調(diào)函數(shù)。要是當(dāng)前代碼耗時(shí)很長(如有for循環(huán)),有可能要等很久,所以并沒有辦法保證,回調(diào)函數(shù)一定會在setTimeout()指定的時(shí)間執(zhí)行。
setTimeout(function(){console.log('0')},0); //意思是回調(diào)函數(shù)加入事件隊(duì)列的隊(duì)尾,主線程和事件隊(duì)列的函數(shù)執(zhí)行完成之后立即執(zhí)行定時(shí)器的回調(diào)函數(shù),如果定時(shí)器的定時(shí)是相同的,就按定時(shí)器回調(diào)函數(shù)的先后順序來執(zhí)行。 console.log(1); setTimeout(function(){console.log(2);},1000); setTimeout(function(){console.log(4);},1000); console.log(3); //1 3 0 2 4SetImmediate
setImmediate()是將事件插入到事件隊(duì)列尾部,主線程和事件隊(duì)列的函數(shù)執(zhí)行完成之后立即執(zhí)行setImmediate指定的回調(diào)函數(shù),和setTimeout(fn,0)的效果差不多,但是當(dāng)他們同時(shí)在同一個(gè)事件循環(huán)中時(shí),執(zhí)行順序是不定的。
結(jié)論:
在 文件I/O、網(wǎng)絡(luò)I/O 中,setImmediate()會先于setTimeout(fn,0)
其他一般情況下,setTimeout(fn,0)會先于setImmediate()
執(zhí)行結(jié)果
process.nextTick()
process.nextTick()方法可以在當(dāng)前"執(zhí)行棧"的尾部待下一次Event Loop(主線程讀取"任務(wù)隊(duì)列")之前觸發(fā)process指定的回調(diào)函數(shù)。也就是說,它指定的任務(wù)總是發(fā)生在所有異步任務(wù)之前,當(dāng)前主線程的末尾。(nextTick雖然也會異步執(zhí)行,但是不會給其他io事件執(zhí)行的任何機(jī)會)
process.nextTick(function A() {console.log(1);process.nextTick(function B(){console.log(2);}); });setTimeout(function C() {console.log(3'); }, 0) // 1 // 2 // 3執(zhí)行順序:
主線程>微任務(wù)>宏任務(wù)
總結(jié)
以上是生活随笔為你收集整理的setTimeout和setImmediate以及process.nextTick的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光猫指示灯--路由器
- 下一篇: 使用WIFI模块与阿里云物联网套件进行透