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


Posted in Javascript onNovember 26, 2014

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");

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

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

在看代码:

 setImmediate(function(){

     console.log("延迟执行");

 });

 console.log("正常执行");

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

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

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

看代码:

代码一:

process.nextTick(function(){

    console.log("nextTick延迟")

});

setImmediate(function(){

    console.log("setImmediate延迟");

});

console.log("正常执行");

结果:

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

代码二:

setImmediate(function(){

    console.log("setImmediate延迟");

});

process.nextTick(function(){

    console.log("nextTick延迟")

});

console.log("正常执行");

结果:

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

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

从结果可以发现:

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("正常执行");

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

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

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

Javascript 相关文章推荐
JS查看对象功能代码
Apr 25 Javascript
javascript 伪数组实现方法
Oct 11 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
jQuery实现用户注册的表单验证示例
Aug 28 Javascript
Javascript Web Slider 焦点图示例源码
Oct 10 Javascript
Jquery实现弹性滑块滑动选择数值插件
Aug 08 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
javascript图片预览和上传(兼容IE)
Mar 15 Javascript
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
Dec 01 Javascript
JavaScript定义类和对象的方法
Nov 26 #Javascript
node.js操作mongoDB数据库示例分享
Nov 26 #Javascript
教你如何使用node.js制作代理服务器
Nov 26 #Javascript
浅析node.js中close事件
Nov 26 #Javascript
node.js超时timeout详解
Nov 26 #Javascript
node.js+Ajax实现获取HTTP服务器返回数据
Nov 26 #Javascript
使用node.js 获取客户端信息代码分享
Nov 26 #Javascript
You might like
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
js获取div高度的代码
2008/08/09 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
Javascript 继承机制实例
2009/08/12 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
原生js实现验证码功能
2017/03/16 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
小程序组件之仿微信通讯录的实现代码
2018/09/12 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
2018/11/02 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
Python如何根据时间序列数据作图
2020/05/12 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
技术人员面试提纲
2013/11/28 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
励志演讲稿大全
2014/08/21 职场文书
挂职学习心得体会
2014/09/09 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript
python必学知识之文件操作(建议收藏)
2021/05/30 Python
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android