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 相关文章推荐
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
Nov 18 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 Javascript
js实现仿购物车加减效果
Mar 01 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
Jul 26 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
May 21 Javascript
JavaScript RegExp 对象用法详解
Sep 24 Javascript
js实现div色块拖动录制
Jan 16 Javascript
vue axios请求成功却进入catch的原因分析
Sep 08 Javascript
微信小程序实现身份证取景框拍摄
Sep 09 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 多进程 解决难题
2009/06/22 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
帝国cms常用标签汇总
2015/07/06 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
实例讲解Vue.js中router传参
2018/04/22 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
大学生实习自我鉴定
2013/12/11 职场文书
鲜果饮品店创业计划书
2014/01/21 职场文书
函授毕业自我鉴定
2014/02/04 职场文书
统计岗位职责
2014/02/21 职场文书
校本培训个人总结
2015/02/28 职场文书
护士自荐信怎么写
2015/03/06 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang