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 相关文章推荐
javascript获取url上某个参数的方法
Nov 08 Javascript
jquery删除提示框弹出是否删除对话框
Jan 07 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
Feb 06 Javascript
最丑的时钟效果!js canvas时钟制作方法
Aug 15 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
Aug 16 Javascript
js监听input输入框值的实时变化实例
Jan 26 Javascript
jquery 仿锚点跳转到页面指定位置的实例
Feb 14 Javascript
解决vue 项目引入字体图标报错、不显示等问题
Sep 01 Javascript
React+TypeScript+webpack4多入口配置详解
Aug 08 Javascript
20多个小事例带你重温ES10新特性(小结)
Sep 29 Javascript
node.js实现简单的压缩/解压缩功能示例
Nov 05 Javascript
利用js实现简单开关灯代码
Nov 23 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
拼音码表的生成
2006/10/09 PHP
一个PHP日历程序
2006/12/06 PHP
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
Python中的字典遍历备忘
2015/01/17 Python
Python格式化输出%s和%d
2018/05/07 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
Python常用特殊方法实例总结
2019/03/22 Python
使用python实现对元素的长截图功能
2019/11/14 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
旧时光糖果:Old Time Candy
2018/02/05 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
公司领导班子对照材料
2014/08/18 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
社会实践活动报告
2015/02/05 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android