iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Modern Web

Node.js 非專業解說系列 第 9

DAY9: setImmediate 與 nextTick的比較

  • 分享至 

  • xImage
  •  

繼上一篇的DAY8: process.nextTick(),今天要介紹新方法並相互比較。

setImmediate()是Node的提出的,並不屬於ECMAScript的標準。
setImmediate()process.nextTick()相同點是都是將回調函數加入到佇列(immediateQueue)中,
但不同的點是setImmediate()會在事件循環的結尾觸發,會在poll階段結束後執行。

透過文字敘述的比較好像有點饒舌了,下面直接看setImmediate()process.nextTick()執行的先後順序。
實際例子:

//setImmediate與nextTick
setImmediate(()=>
{
  console.log("setImmediate !!");
});
process.nextTick(()=>
{
  console.log("nextTick");
});

執行結果:https://ithelp.ithome.com.tw/upload/images/20210920/20140244XrYN8epCrU.jpg

由結果可知,process.nextTick()會在setImmediate() 前先執行,
不管這兩個的輸入指令順序前後,永遠都是這個定律。
那麼在加入前一篇所說的內容,比較log、nextTick、setImmediate三者的順序。

//setImmediate與nextTick與log
setImmediate(()=>
{
  console.log("setImmediate !!");
});
process.nextTick(()=>
{
  console.log("nextTick");
});
console.log("BY Nicole !!");

執行結果:

https://ithelp.ithome.com.tw/upload/images/20210920/20140244eaAenkuZ1A.jpg

前一篇DAY8: process.nextTick()的結尾有提出當有遞迴出現的時候不能使用nextTick,那麼在這裡使用可以嗎?
例子:
設立一個遞迴,從1開始加2,上限是10。

//setImmediate出現遞迴
function Nicole(x,y)
{
    if(x>y)
    {
        console.log('Finish!!!!!');
    }
    else
    {
        console.log(x);
        setImmediate(Nicole,x+2,y);
    }
}
Nicole(1,10);

執行結果:

https://ithelp.ithome.com.tw/upload/images/20210920/20140244B3kKidn0tk.jpg

喔耶!!! 是可以被執行!因為setImmediate()不會產生呼叫堆疊(call stack)。

總結:
setImmediate的中文翻譯是立即設置,但是它執行的行為與命名的意思背道而馳…,
反而是nextTick比它還快速…,所以千萬不要被表面意思所騙了,
在有使用遞迴的操作上也需要特別注意,不是使用比較快的那個就比較好!!!!


上一篇
DAY8: process.nextTick( )
下一篇
DAY10: setTimeout和setImmediate的比較
系列文
Node.js 非專業解說30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
zoeke9011
iT邦新手 5 級 ‧ 2021-09-21 21:11:33

歐耶!!!!原來如此!!!(好清楚的解說跟示範!!!

歐耶~謝謝尼~~/images/emoticon/emoticon25.gif

我要留言

立即登入留言