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 相关文章推荐
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
Oct 01 Javascript
如何使用json在前后台进行数据传输实例介绍
Apr 11 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
Jun 17 Javascript
JS简单计算器实例
Jan 20 Javascript
js简单的点击返回顶部效果实现方法
Apr 10 Javascript
js实现左侧网页tab滑动门效果代码
Sep 06 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
js中获取时间new Date()的全面介绍
Jun 20 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
Vue 动态组件与 v-once 指令的实现
Feb 12 Javascript
jQuery实现计算器功能
Oct 19 jQuery
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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
php zip文件解压类代码
2009/12/02 PHP
php将时间差转换为字符串提示
2011/09/07 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
使用js获取QueryString的方法小结
2010/02/28 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
js编写选项卡效果
2017/05/23 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
微信小程序通过js实现瀑布流布局详解
2019/08/28 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
centos下更新Python版本的步骤
2013/02/12 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
医院检讨书范文
2014/02/01 职场文书
2014年科普工作总结
2014/12/06 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书
Python基础之元编程知识总结
2021/05/23 Python
Python包argparse模块常用方法
2021/06/04 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs