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 相关文章推荐
ASP中Sub和Function的区别说明
Aug 30 Javascript
javascript之典型高阶函数应用介绍
Jan 10 Javascript
javascript表单验证和Window详解
Dec 11 Javascript
JavaScript中property和attribute的区别详细介绍
Mar 03 Javascript
javascript中alert()与console.log()的区别
Aug 26 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
JavaScript必知必会(六) delete in instanceof
Jun 08 Javascript
js数组操作方法总结(必看篇)
Nov 22 Javascript
浅析Ajax语法
Dec 05 Javascript
React Navigation 使用中遇到的问题小结
May 08 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
May 07 Javascript
OpenLayers3实现对地图的基本操作
Sep 28 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
Smarty Foreach 使用说明
2010/03/23 PHP
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
物理力学求职信
2014/02/18 职场文书
项目施工员岗位职责
2014/03/09 职场文书
出纳会计岗位职责
2014/03/12 职场文书
教师一岗双责责任书
2014/04/16 职场文书
产品质量保证书
2014/04/29 职场文书
爱国主义演讲稿
2014/05/07 职场文书
书香家庭事迹材料
2014/05/09 职场文书
公司董事长助理工作职责
2014/07/12 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
市场营销计划书
2015/01/17 职场文书
党员转正党支部意见
2015/06/02 职场文书
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server