DAY9: setImmediate 与 nextTick的比较

继上一篇的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比它还快速…,所以千万不要被表面意思所骗了,
在有使用递回的操作上也需要特别注意,不是使用比较快的那个就比较好!!!!


<<:  day21 : TIDB on K8S (上)

>>:  Day 9 Swift语法-进阶篇(2/5)-Inheritance

Day12 分散式储存系统的必要功能

储存领域有个重要的定理 - CAP定理,C(Consistency一致性)A(Availabilit...

Day 4 基本型别 - part 1

今天要介绍 TypeScript 的基本型别,TypeScript 跟 JavaScript 一样拥...

[DAY 12] 依选项前往区段

之前有提到单选题与下拉式选单都可以设定「依选项前往区段」 在这里我们利用「座号」前往区段 连结「座号...

影片剪辑软件推荐~~

请问有没有剪辑软件自带文字转语音(GOOGLE小姐或SIRI小姐)配音功能?不用另外录制。 ...

[Tableau Public] day 3:tableau public 介面 & 制作第一张报表

进度来到第三天,终於要打开 tableau public 并实际操作看看了,大家是不是也很期待呢? ...