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数组的扩展实现代码集合
Jun 01 Javascript
随窗体滑动的小插件sticky源码
Jun 21 Javascript
jQuery的图片滑块焦点图插件整理推荐
Dec 07 Javascript
node.js中的console.timeEnd方法使用说明
Dec 09 Javascript
JQuery中serialize()用法实例分析
Feb 06 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 jQuery
vue实现绑定事件的方法实例代码详解
Jun 20 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
Oct 17 Javascript
create-react-app中添加less支持的实现
Nov 15 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
node脚手架搭建服务器实现token验证的方法
Jan 20 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
967 个函式
2006/10/09 PHP
php escape URL编码
2008/12/10 PHP
PHP会话处理的10个函数
2015/08/11 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
Jquery中获取iframe的代码
2011/01/11 Javascript
ECMAScript 创建自己的js类库
2012/11/22 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
python读取注册表中值的方法
2013/04/08 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
pywinauto自动化操作记事本
2019/08/26 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
python如何调用百度识图api
2020/09/29 Python
python切割图片的示例
2020/11/12 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
意大利会呼吸的鞋:Geox健乐士
2017/02/12 全球购物
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
文秘专业大学生求职信
2013/11/10 职场文书
建筑投标担保书
2014/05/20 职场文书
文艺晚会策划方案
2014/06/11 职场文书
诚信教育主题班会
2015/08/13 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
一条慢SQL语句引发的改造之路
2022/03/16 MySQL
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis