node.js中的定时器nextTick()和setImmediate()区别分析

 更新时间:2014年11月26日 16:16:24   投稿:hebedich  
本文介绍了node.js中的定时器nextTick()和setImmediate()的区别分析,非常的不错,这里推荐给大家。

1.node中使用定时器的问题在于,它并非精确的.譬如setTimeout()设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms,再次轮到定时器时,已经耽误了4ms.

好了node中的定时器就简单的讲这么多.

2.看代码:

复制代码 代码如下:

process.nextTick(function(){
    console.log("延迟执行");
});
console.log("正常执行1");
console.log("正常执行2");
console.log("正常执行3");
console.log("正常执行4");

通过这个例子,我想大家很清楚的就能看到nextTick()是用来干嘛的了.主要是用来异步执行的.

在看代码:

复制代码 代码如下:

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

我们发现setImmediate也是异步执行的.奇怪了

那么它与nextTick()有什么区别呢?

看代码:

代码一:

复制代码 代码如下:

process.nextTick(function(){
    console.log("nextTick延迟")
});
setImmediate(function(){
    console.log("setImmediate延迟");
});
console.log("正常执行");

结果:

代码二:

复制代码 代码如下:

setImmediate(function(){
    console.log("setImmediate延迟");
});
process.nextTick(function(){
    console.log("nextTick延迟")
});
console.log("正常执行");

结果:

发现代码虽然顺序不一样,但是执行的结果是一样的.

从结果可以发现:

nextTick()的回调函数执行的优先级要高于setImmediate();

process.nextTick()属于idle观察者,setImmediate()属于check观察者.在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者.

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

复制代码 代码如下:

//加入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调用的情况.

以上就是相关node.js中的定时器nextTick()和setImmediate()区别的资料了,小伙伴们是否清楚了他们之间的区别了呢?

相关文章

  • Puppeteer环境搭建的详细步骤

    Puppeteer环境搭建的详细步骤

    这篇文章主要介绍了Puppeteer环境搭建的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 详解Node全局变量global模块

    详解Node全局变量global模块

    这篇文章主要介绍了详解Node全局变量global模块,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Node.js+Express+Vue+MySQL+axios的项目搭建全过程

    Node.js+Express+Vue+MySQL+axios的项目搭建全过程

    这篇文章主要介绍了Node.js+Express+Vue+MySQL+axios的项目搭建全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • node.js插件nodeclipse安装图文教程

    node.js插件nodeclipse安装图文教程

    这篇文章主要为大家分享了node.js插件nodeclipse安装图文教程,如何安装node.js支持插件,下面小编为大家分享具体步骤
    2016-05-05
  • 解决node终端下运行js文件不支持ES6语法

    解决node终端下运行js文件不支持ES6语法

    这篇文章主要介绍了解决node终端下运行js文件不支持ES6语法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Electron如何通过ffi-napi调用dll导出接口

    Electron如何通过ffi-napi调用dll导出接口

    文章介绍了如何在Electron项目中使用ffi-napi模块调用DLL文件,并详细描述了环境搭建、安装Electron和ffi-napi、配置Visual Studio和Python环境、解决常见问题等步骤,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • node.js实现逐行读取文件内容的代码

    node.js实现逐行读取文件内容的代码

    这篇文章主要介绍了node.js实现逐行读取文件内容的代码,本文还介绍了一个node.js的按行读取内容开源项目,需要的朋友可以参考下
    2014-06-06
  • 浅谈如何把Node项目部署到服务器上

    浅谈如何把Node项目部署到服务器上

    本文主要介绍了浅谈如何把Node项目部署到服务器上,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • nodejs 递归拷贝、读取目录下所有文件和目录

    nodejs 递归拷贝、读取目录下所有文件和目录

    这篇文章主要介绍了nodejs 递归拷贝、读取目录下所有文件和目录,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Nodejs实现定时爬虫的完整实例

    Nodejs实现定时爬虫的完整实例

    这篇文章主要给大家介绍了关于Nodejs实现定时爬虫的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论