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