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实现div居中示例
Apr 17 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
Jan 04 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
Feb 25 Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
vue如何在自定义组件中使用v-model
May 14 Javascript
vuex actions传递多参数的处理方法
Sep 18 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
Nov 15 Javascript
JavaScript一元正号运算符示例代码
Jun 30 Javascript
基于layui框架响应式布局的一些使用详解
Sep 16 Javascript
JS面向对象之多选框实现
Jan 17 Javascript
利用js实现简易红绿灯
Oct 15 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 连接mysql连接被重置的解决方法
2011/02/15 PHP
php操作JSON格式数据的实现代码
2011/12/24 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
javascript json 新手入门文档
2009/12/03 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
Angular排序实例详解
2017/06/28 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
python paramiko实现ssh远程访问的方法
2013/12/03 Python
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
打包发布Python模块的方法详解
2016/09/18 Python
python使用opencv读取图片的实例
2017/08/17 Python
python中模块的__all__属性详解
2017/10/26 Python
用python处理MS Word的实例讲解
2018/05/08 Python
详解python 注释、变量、类型
2018/08/10 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
Python编写单元测试代码实例
2020/09/10 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
同程旅游英文网站:LY.com
2018/11/13 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
兼职学生的自我评价
2013/11/24 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
文秘求职信范文
2014/04/10 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
2016大学军训心得体会
2016/01/11 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS