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 相关文章推荐
jquery CSS选择器笔记
Mar 29 Javascript
jQuery EasyUI API 中文文档 - Form表单
Oct 06 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
Feb 05 Javascript
javascript标签在页面中的位置探讨
Apr 11 Javascript
js交换排序 冒泡排序算法(Javascript版)
Oct 04 Javascript
js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
Apr 01 Javascript
js对象浅拷贝和深拷贝详解
Sep 05 Javascript
JavaScript字符串对象(string)基本用法示例
Jan 18 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 Javascript
微信小程序引用iconfont图标的方法
Oct 22 Javascript
Vue组件通信的几种实现方法
Apr 25 Javascript
ES6实现图片切换特效代码
Jan 14 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
如何隐藏你的.php文件
2007/01/04 PHP
第五章 php数组操作
2011/12/30 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
使用K.function()调试keras操作
2020/06/17 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
Python如何实现单例模式
2016/06/03 面试题
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
机械工程师岗位职责
2014/06/16 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
Python的这些库,你知道多少?
2021/06/09 Python
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android