【第2章 Node.js基础】2.5 Node.js 的定时器

定时器timers 模块对外暴露一个全局的API用于调度在某个时段调用的函数因为定时器函数是全局变量,所以不需要加载timers 模块来使用它。Node.s 的定时器函敬实现了与 Web 浏览器提供的定时器 API 类似的 AP,但是它们使用了不同的内部实现机制,Nodeis 的定时器函数是基于 Node.s 事件循环构建的。

设置定时器

Node.js 中的定时器在一段时间后会调用给定的函数。何时调用定时器函数取决于用来创建定时器的方法及Node.is 事件循环正在执行的其他工作。

1, 一次性定时器

基本用法:

setTimeout(callback,delay[,...argsl)

这个方法用于延迟一个函数的执行时间,在到达指定的时间点执行该函数,并且只执行一次。其中参数 callback 用于指定要调用的回调函数,delay 设置调用回调函数之前等待的毫秒数,args 设置调用回调函数时传入的可选参数。它返回 Timeout 对象的ID,该D 可以传递给 clearTimeOut0)以取消该定时器。例如,下面的代码将在 1秒后输出提示信息,之后定时器就不再起作用。

setTimeout(function()console.log('我是一个一次性的定时器');
},1000);

定时器可能不会精确地在指定的时刻调用回调函数。Node.js 不保证回调被触发的确切时间,也不保证它们的顺序。回调函数会尽可能接近指定的时间,并在该时间点被调用。

2.周期性定时器

基本用法:

setInterval(callback, delay[,...argsl)

这个方法用于以指定的时间间隔周期性地执行回调函数,其参数和返回值同上述 setTimeout0)方法的参数和返回值。

例如,下面的代码将在 1 秒之后输出提示信息,之后定时器每隔 1 秒就重复输出提示信息,除非使用clearlnterval( )方法取消该定时器,或者终止程序。

setInterval (function(){console.log('我是一个周期性的定时器');
},1000);

3.即时定时器

基本用法:

setImmediate(callback[...args])

这个方法用于在 I/O 事件的回调之后立即执行回调函数,其比上述 setTimeout0方法少了一个 delay参数,返回的是Immediate 对象。

这是一个即时定时器,该方法并不会立即执行回调函数,而是在事件轮询之后执行函数,为了防止轮询阻塞,在每轮循环中仅执行链表中的一个回调函数。当程序多次调用 setlmmediate0)方法时,由该参数指定的回调函数将按照创建它们的顺序排队等待执行。每次事件循环迭代都会处理整个回调队列。如果即时定时器通过正在执行的回调加入队列,则要等到下一次事件循环迭代时才会被触发。

取消定时器

上述 setTimeout( )、setlnterval( )和 setlmmediate( )方法各自返回表示所设置的定时器的对象,这些对象可以用来取消定时器并防止该定时器触发,分别用 cearTimeout( )、cearinterval( )和clearlmmediate( )方法取消相应定时器。

例如,以下代码使用 setinterval( )方法设置周期性定时器后,使用clearinterval( )方法取消定时期

var testInterval=setInterval(testFunc,2000);
clearInterval(testInterval);

Timeout 和 Immediate 类

Node.js 内置了两个与定时器相关的类:Timeout 和 Immediate。可以使用 setTimeout() 或 setInterval() 方法创建 Timeout 对象,并使用 clearTimeout() 或 clearInterval() 方法取消定时器。默认情况下,当设置了定时器后,Node.js 事件循环将继续执行。

Timeout 对象提供了 timeout.ref() 和 timeout.unref() 方法,用于控制定时器的默认行为。ref() 方法将定时器添加到事件循环中,使其保持活动状态,而 unref() 方法将定时器从事件循环中移除,使其不再影响事件循环的执行。

Immediate 对象可以使用 setImmediate() 方法创建,并使用 clearImmediate() 方法取消即时定时器。默认情况下,当设置了即时定时器后,Node.js 事件循环将继续执行。

Immediate 对象提供了 immediate.ref() 和 immediate.unref() 方法,用于控制即时定时器的默认行为。ref() 方法将即时定时器添加到事件循环中,使其保持活动状态,而 unref() 方法将即时定时器从事件循环中移除,使其不再影响事件循环的执行。

需要注意的是,在 setTimeout() 或 setInterval() 方法中,this 关键字在 JavaScript 中指向 window 对象,而在 Node.js 中指向 Timeout 对象。

setImmediate() 方法和 setTimeout() 方法

与 setTimeout() 方法相比,setImmediate() 方法的主要优点是,无论在一个 I/O 周期内有多少个定时器,setImmediate() 方法都会在当前事件循环迭代的末尾执行。

方法setImmediate()setTimeout()
执行时机在事件循环的下一个迭代中立即执行在指定的延迟时间后执行
执行顺序在当前事件循环迭代的末尾执行在当前事件循环迭代的末尾执行
延迟时间无延迟,立即执行可以设置延迟时间
取消定时器使用 clearImmediate() 方法使用 clearTimeout() 方法
默认行为在活动状态下,不会阻塞事件循环在活动状态下,不会阻塞事件循环
控制默认行为使用 immediate.ref() 和 immediate.unref() 方法使用 timeout.ref() 和 timeout.unref() 方法
this 关键字指向 Immediate 对象指向 Timeout 对象

一个IO周期(即主模块)内执行两个定时器函数(timeout_vs immediate1.js)

setTimeout(() => {console.log('一次性');
}, 0);setImmediate(() => {console.log('即时性');
});

在这个例子中,setTimeout() 设置了一个延迟时间为 0 的定时器,而 setImmediate() 设置了一个即时定时器。

在一个 I/O 周期内调用这两个方法时,它们的执行顺序是不确定的,因为它们都是在当前事件循环迭代的末尾执行。具体执行顺序可能受到事件循环的状态和其他异步操作的影响。

执行结果:

PS D:\WuWorkSpace\code\NodejsProject\nodejs实战学习\【第2章  Node.js基础】\2.5计时器> node .\timeout_vs_immediate.js
即时性
一次性
PS D:\WuWorkSpace\code\NodejsProject\nodejs实战学习\【第2章  Node.js基础】\2.5计时器> node .\timeout_vs_immediate.js
一次性
即时性

但是,如果将这两个函数放入一个I/O 循环内,那么setlmmediate 总是被优先调用

同一个I/O 循环内执行两个定时器函数(timeout_vs immediate2.js)

const fs = require('fs');
fs.readFile(__filename, () => {setTimeout(() => {console.log('一次性');}, 0);setImmediate(() => {console.log('即时性');});
});

执行结果如下:


PS D:\WuWorkSpace\code\NodejsProject\nodejs实战学习\【第2章  Node.js基础】\2.5计时器> node '.\timeout_vs immediate2.js'
即时性
一次性
PS D:\WuWorkSpace\code\NodejsProject\nodejs实战学习\【第2章  Node.js基础】\2.5计时器> node '.\timeout_vs immediate2.js'
即时性
一次性
PS D:\WuWorkSpace\code\NodejsProject\nodejs实战学习\【第2章  Node.js基础】\2.5计时器> node '.\timeout_vs immediate2.js'
即时性
一次性

process.nextTick()setImmediate()

process.nextTick()setImmediate() 都是用于在 Node.js 中执行异步操作的方法,但它们之间有一些重要的区别。

下面是 process.nextTick()setImmediate() 的对比:

方法process.nextTick()setImmediate()
执行时机在当前操作完成后,下一个事件循环迭代之前执行在当前事件循环的末尾执行
执行顺序在当前事件循环迭代中的最后执行在当前事件循环迭代的末尾执行
优先级高优先级,比其他异步操作(包括定时器)更早执行低优先级,比其他异步操作(包括定时器)稍后执行
嵌套调用允许嵌套调用,可以无限递归不允许嵌套调用,避免无限递归
控制默认行为无法控制默认行为使用 immediate.ref() 和 immediate.unref() 控制默认行为
this 关键字指向当前模块的 exports 对象指向 Immediate 对象

总的来说,process.nextTick() 方法具有更高的优先级,它会在当前操作完成后立即执行,而不需要等待下一个事件循环迭代。这使得它在需要优先执行的情况下非常有用,例如在处理错误回调或需要立即更新状态的情况下。

相比之下,setImmediate() 方法在当前事件循环迭代的末尾执行,它的优先级较低。它适用于需要在当前事件循环迭代的末尾执行回调函数的情况,避免阻塞其他异步操作。

需要注意的是,process.nextTick() 方法允许嵌套调用,这意味着可以在回调函数中再次调用 process.nextTick(),从而形成无限递归。而 setImmediate() 方法不允许嵌套调用,避免了无限递归的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云4核8G和2核4G服务器五年优惠价格表

腾讯云百科整理五年云服务器优惠活动 txybk.com/go/txy 配置可选2核4G和4核8G,公网带宽可选1M、3M或5M,系统盘为50G高性能云硬盘,标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器,睿频3…

The 8th China Open Source Conference Successfully Concludes

由开源社主办的第八届中国开源年会(COSCon23)于 2023年10月29日在成都圆满收官。本次大会,为期两天,线下参会报名逾千人次,在线直播观看人数总计 168610 人,直播观看次数达 248725 次,官网累计浏…

LeetCode【238】除自身意外的数组的乘积

题目&#xff1a; 思路&#xff1a; https://zhuanlan.zhihu.com/p/109306706?utm_id0 代码&#xff1a; int n nums.length;int[] l new int[nums.length];int[] r new int[nums.length];l[0] 1;r[n-1] 1;for (int i1;i<nums.length;i) {l[i] l[i-1] * nums[i-1]…

使用字典树实现一个可以自动补全的输入框

说在前面 平时我们在终端输入命令的时候是不是都可以通过tab键来进行快速补全&#xff1f;那么有没有想过怎么去实现这个自动补全的功能呢&#xff1f;今天让我们一起来使用字典树实现一个可以自动补全的输入框。 效果展示 体验地址 http://jyeontu.xyz/jvuewheel/#/JAutoComp…

【C++】替代--whole-archive的一种方式

上篇文章《C自动注册的工厂与--whole-archive》提到了--whole-archive选项在自动工厂示例的必要&#xff0c;“貌似也没其他方法了”。 这篇文章介绍另一种可以替代的方式&#xff0c;并分析其优缺点&#xff0c;采用的代码示例同上篇文章。文章最后附代码。 方法介绍 ld链接器…

Python+Qt多点最短路径(最优路径)算法实现

程序示例精选 PythonQt多点最短路径(最优路径)算法实现 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonQt多点最短路径(最优路径)算法实现》编写代码&#xff0c;代码整洁&#xff0…

Qt执行带参sql

//准备执行的sql语句&#xff0c;此为带参的sql语句query.prepare("update employee set Name:Name, Gender:Gender,Height:Height,"" Birthday:Birthday, Mobile:Mobile, Province:Province,"" City:City, Department:Department, Education:Educati…

Android 透明度设置

目录 一、透明度对照表 二、透明度介绍 三、透明度设置 3.1 xml设置 3.2 代码设置 一、透明度对照表 注&#xff1a;00是完全透明&#xff0c;FF就是完全不透明 我们的UI小姐姐就喜欢给「不透明度」&#xff0c;这个需要自己判断一下。 完全透明:0% HEX: 00 透明度:1%…

MR混合现实情景实训教学系统模拟历史情景

二、应用场景 1. 古代战争场景&#xff1a;通过MR混合现实情景实训教学系统&#xff0c;学生可以亲身体验古代战争的场景&#xff0c;如战场布置、战术运用等。这不仅有助于学生更好地理解古代战争的特点&#xff0c;还能够培养他们的团队协作和战略思维能力。 2. 历史文化古…

SparkSQL数据的加载与保存

1 读取和保存文件 SparkSQL读取和保存的文件一般为三种&#xff0c;JSON文件、CSV文件和列式存储的文件&#xff0c;同时可以通过添加参数&#xff0c;来识别不同的存储和压缩格式。 1.1 CSV文件 1&#xff09;代码实现 package com.atguigu.sparksql; import com.atguigu.spar…

vscode+python开发之虚拟环境和解释器切换

需求情景&#xff1a; 现在我们要开发多个项目比如&#xff1a;项目A&#xff0c;项目B、项目C&#xff0c;他们每个项目需要依赖不同的库。每个项目依赖的解释器也不一样怎么办&#xff1f; 项目A&#xff1a;需要在python3.7环境运行 依赖aadd3.2库 项目B、需要在python3.11…

C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录 完整代码实现参考-非项目使用项目使用的代码 - 乱-但是思路与上面的相同创建Kernel类添加删除修改epoll&#xff0c;才能写run方法创建stdin_Channel类在Kernel类中实现run方法 完整代码实现参考-非项目使用 #include <errno.h> #include <signal.h> #in…

2024上海国际智能驾驶技术展览会(自动驾驶展)

2024上海国际智能驾驶技术展览会 2024 Shanghai International Autonomous driving Expo 时间&#xff1a;2024年3月26-28日 地点&#xff1a;上海跨国采购会展中心 随着科技的飞速发展&#xff0c;智能驾驶已经成为了汽车行业的重要趋势。在这个时代背景下&#xff0c;汽车不…

Ansys Lumerical | 用于增强现实系统的表面浮雕光栅

在本示例中&#xff0c;我们使用 RCWA 求解器设计了一个斜面浮雕光栅 (SRG)&#xff0c;它将用于将光线耦合到单色增强现实 (AR) 系统的波导中。光栅的几何形状经过优化&#xff0c;可将正常入射光导入-1 光栅阶次。 然后我们将光栅特性导出为 Lumerical Sub-Wavelength Model …

数字媒体技术基础之:常见图片文件格式

在数字图像处理和图形设计领域&#xff0c;了解不同的图片文件格式及其特点是至关重要的。每种格式都有其独特的用途和优势。以下介绍一些最常见的图片文件格式。 JPEG Joint Photographic Experts Group 扩展名&#xff1a;.jpg 或 .jpeg 特点&#xff1a; 1、有损压缩&#x…

【Proteus仿真】【51单片机】拔河游戏设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED、动态数码管模块等。 主要功能&#xff1a; 系统运行后&#xff0c;指示灯处于中间位置&#xff0c;数码管显示得分0&#xff0c;当按下…

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件 2023/11/14 14:11 手机&#xff1a;Realme Q 笔记本电脑&#xff1a;HP https://item.jd.com/100012583174.html 惠普&#xff08;HP&#xff09;战66 三代AMD版 14英寸轻薄笔记本电脑&#xff08;锐龙7nm 六核…

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果…

数据拟合、参数估计、插值等数据处理算法

介绍 数据拟合&#xff1a; 数据拟合是通过选择或构建合适的函数模型&#xff0c;将给定的数据点与该函数模型进行匹配和拟合的过程。常见的数据拟合方法包括最小二乘法和非线性最小二乘法。最小二乘法通过最小化实际数据与拟合函数的残差平方和来求解最优拟合参数。非线性最小…