0
点赞
收藏
分享

微信扫一扫

node 中的定时器, nextTick()和setImmediate()的使用 有啥区别?

nextTick 是 process变量的方法,接受一个函数 ,用于异步执行函数 使用方法如下:

process.nextTick(function () {
console.log(5);
});
console.log(1);
console.log(2);
console.log(3);
console.log(4);
// 1,2,3,4,5

setImmediate 使用方法如下:

setImmediate(function () {
console.log(延迟执行);
});
console.log(正常执行);
// 正常执行 , 延迟执行

通过测试我们发现不管顺序怎样 nextTick 的执行顺序都是优先于 setimmediate的

从结果可以发现:
nextTick()的回调函数执行的优先级要高于setImmediate(); process.nextTick()属于idle观察者, setImmediate()属于check观察者, 在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者.

idle观察者,也就是事件轮询最先进行的任务
I/O观察者, 也就是事件轮询中的任务(任务中的回调函数)
check观察者 事件轮询中的任务的结束

在具体实现上,process.nextTick()的回调函数保存在一个数组中, setImmediate()的结果则是保存在链表中. 在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完. 而setImmediate()在每轮循环中执行链表中的一个回调函数.

区别就是:
setImmidate 是宏任务 宏任务保存在链表中
nextTick 是微任务 微任务保存在数组中
事件循环时每次先执行所有的微任务, 然后在拿一个宏任务来执行。
下面的例子:

//加入2个nextTick()的回调函数
process.nextTick(function () {
console.log(nextTick延迟执行1);
});
process.nextTick(function () {
console.log(nextTick延迟执行2);
});

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

setImmediate(function () {
console.log(setImmediate延迟执行2);
});

console.log(正常执行);

结果为:

从执行结果上看出:当第一个setImmediate()的回调函数执行完后,并没有立即执行第二个,而是进入了下一轮循环,再次按nextTick()优先,setImmediate()次后的顺序执行.之所以这样设计,是为了保证每次循环能够较快的执行结束.防止CPU占用过多而阻塞后续I/O调用的情况.

举报

相关推荐

0 条评论