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 document.referrer判断访客来源网址
May 15 Javascript
最简单的tab切换实例代码
May 13 Javascript
javaScript知识点总结(必看篇)
Jun 10 Javascript
Angular2 (RC5) 路由与导航详解
Sep 21 Javascript
基于JavaScript实现轮播图原理及示例
Apr 10 Javascript
JavaScript事件对象event用法分析
Jul 27 Javascript
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 jQuery
vue-better-scroll 的使用实例代码详解
Dec 03 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
Sep 16 Javascript
如何手写简易的 Vue Router
Oct 10 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中JSON的使用与转换
2015/01/14 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
扩展String功能方法
2006/09/22 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
Python常用小技巧总结
2015/06/01 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
文秘应届生求职信
2014/07/05 职场文书
热爱劳动主题班会
2015/08/14 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers