blog icon indicating copy to clipboard operation
blog copied to clipboard

nodeJS 定时器函数和nextick的区别

Open mishe opened this issue 8 years ago • 0 comments

在nodeJS中,有3个开启定时器的函数,分别是setTimeout, setInterval, setImmediate; 在加上noTickde的process.nextTick,一共提供了4种异步执行代码的方式,有什么区别呢?

执行顺序

首先通过代码来分析

setTimeout(function(){
    console.log('setTimeout    1')
})
process.nextTick(function(){
    console.log("nextTick延迟执行2");
});
process.nextTick(function(){
    console.log("nextTick延迟执行1");
});

setImmediate(function(){
    console.log("setImmediate延迟执行2");
});
//加入两个setImmediate()回调函数
setImmediate(function(){
    console.log("setImmediate延迟执行1");
    process.nextTick(function(){
        console.log("强势插入");
    });
});

process.nextTick(function(){
    console.log("nextTick延迟执行3");
});
process.nextTick(function(){
    console.log("nextTick延迟执行4");
});
setTimeout(function(){
    console.log('setTimeout    2')
})
var count=1,
    interval=setInterval(function(){
        if(count<5) {
            count++;
            console.log('setInterval ')
        }else {
            clearInterval(interval)
        }
    })
console.log("正常执行");

最终的执行结果

正常执行                                                                                                                                                                                                      
nextTick延迟执行2                                                                                                                                                                                             
nextTick延迟执行1                                                                                                                                                                                             
nextTick延迟执行3                                                                                                                                                                                             
nextTick延迟执行4                                                                                                                                                                                             
setTimeout    1
setTimeout    2
setInterval
setImmediate延迟执行2                                                                                                                                                                                             
setImmediate延迟执行1                                                                                                                                                                                         
强势插入                                                                                                                                                                                                      
setInterval
setInterval
setInterval

然后通过修改相应代码的位置,可以得出如下结果:

  • setTimeout 和setInterval的时间执行顺序和代码的先后位置有关系
  • process.nextTick的执行优先级是最高的
  • setImmediate总是在当前代码执结束之后才执行
  • 多个 setImmediate并没有如其他同学介绍的那般,会分开多次执行

mishe avatar May 03 '16 09:05 mishe