mishe / blog

前端碰上的问题或体会
230 stars 39 forks source link

nodeJS 定时器函数和nextick的区别 #118

Open mishe opened 8 years ago

mishe commented 8 years ago

在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

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