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数据类型之基本类型和引用类型的值
Apr 01 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
Jun 30 Javascript
js实现防止被iframe的方法
Jul 03 Javascript
jquery动画效果学习笔记(8种效果)
Nov 13 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
微信小程序 欢迎界面开发的实例详解
Nov 30 Javascript
BootStrap中Table隐藏后显示问题的实现代码
Aug 31 Javascript
Express + Session 实现登录验证功能
Sep 08 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
微信小程序wepy框架学习和使用心得详解
May 24 Javascript
js实现带搜索功能的下拉框
Jan 11 Javascript
详解vue修改elementUI的分页组件视图没更新问题
Nov 13 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
让你的网站首页自动选择语言转跳
2006/12/06 PHP
mysql+php分页类(已测)
2008/03/31 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
js用Date对象处理时间实现思路及代码
2013/01/31 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
基于vue-cli3创建libs库的实现方法
2019/12/04 Javascript
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python实现石头剪刀布程序
2021/01/20 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
编程用JAVA解析XML的方式
2013/07/07 面试题
测绘工程系学生的自我评价
2013/11/30 职场文书
办公室主任先进事迹
2014/01/18 职场文书
小学运动会表扬稿
2014/01/19 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
国庆庆典邀请函
2015/02/02 职场文书
2015年安全月活动总结
2015/03/26 职场文书
交通安全主题班会
2015/08/12 职场文书
Python 视频画质增强
2022/04/28 Python