node.js中setTimeOut(),setInterval(),setImmediate()以及process.nextTick()区别

node原理,事件循环,setTimeout/setImmediate/process.nextTick的差别 事件循环 Node.js 在主线程里维护了一个事件队列,当接到请求后,就将该请求作为一个事件放入这个队列中,然后继续接收其他请求。当主线程空闲时(没有请求接入时),就开始循环事件队列,检查队列中是否有要处理的事件,这时要分两种情况:如果是非 I/O 任务,就亲自处理,并通过回调函数返回到上层调用;如果是 I/O 任务,就从 线程池 中拿出一个线程来处理这个事件,并指定回调函数,然后继续循环队列中... 阅读详情

node.js中的非IO的异步API提供了四种方法,分别为setTimeOut(),setInterval(),setImmediate()以及process.nextTick(),四种方法实现原理相似,但达到的效果略有区别:

一、事件循环Event Loop

首先,我们需要了解node.js的基于事件循环的事件模型,正是因为它才使得node.js中回调函数十分普遍,也正是基于此,node.js实现了单线程高效的异步IO(这里说的单线程主要说的是执行javascript代码部分的线程,而异步IO部分node.js其实还是利用线程池去执行的)。

简单的讲就是,在node.js启动时,创建了一个类似while(true)的循环体,每次执行一次循环体称为一次tick,每个tick的过程就是查看是否有事件等待处理,如果有,则取出事件极其相关的回调函数并执行,然后执行下一次tick。所以,有如下代码:

A();
B();
C();

它的执行逻辑是,先询问事件观察者当前是否有任务需要执行?观察者回答“有”,于是取出A执行,A是否有回调函数?如果有(如果没有则继续询问当前是否有任务需要执行),则取出回调函数并执行(注意:回调函数的执行基本都是异步的,可能不止一个回调),执行完回调后通过某种方式通知调用者,我执行完了,并把执行结果给你,你自己酌情处理吧,主函数不需要不断询问回调函数执行结果,回调函数会以通知的方式告知调用者我执行完了(don’t call me ,i will call you.),而这个过程主线程并不需要等待回调函数执行完成,它会继续向前执行,即再次询问观察者当前是否还有任务需要执行,重复上面的步骤。。。直到观察者回答没有了,线程结束。

整个事件循环的逻辑如下图:

这里写图片描述

二:setTimeOut(),setInterval(),setImmediate()以及process.nextTik()

这里面setTimeOut()与setInterval()除了执行频次外基本相同,都表示主线程执行完一定时间后立即执行,而setImmediate()与之十分相似,也表示主线程执行完成后立即执行。那么他们之间的区别是什么呢?

代码如下:

setTimeout(function(){
    console.log("setTimeout");
},0);

setImmediate(function(){
    console.log("setImmediate");
});

 

两者都代表主线程完成后立即执行,其执行结果是不确定的,可能是setTimeout回调函数执行结果在前,也可能是setImmediate回调函数执行结果在前,但setTimeout回调函数执行结果在前的概率更大些,这是因为他们采用的观察者不同,setTimeout采用的是类似IO观察者,setImmediate采用的是check观察者,而process.nextTick()采用的是idle观察者。

三种观察者的优先级顺序是:idle观察者>>io观察者>check观察者

process.nextTick()与setImmediate()和setTimeout()的区别如下:

1、原始代码:

A();
B();
C();

它的执行顺序即代码顺序:

这里写图片描述

2、process.nextTick()执行效果,代码如下:

A();
process.nextTick(B);
C();

它的执行顺序如下:

这里写图片描述

3、setImmediate()或者setTimeout()执行效果,代码如下:

A();
setImmediate(B);//或者setTimeout(B,0);
C();

它的执行顺序如下:

这里写图片描述

结论: 
process.nextTick(),效率最高,消费资源小,但会阻塞CPU的后续调用; 
setTimeout(),精确度不高,可能有延迟执行的情况发生,且因为动用了红黑树,所以消耗资源大; 
setImmediate(),消耗的资源小,也不会造成阻塞,但效率也是最低的。

告别混乱接线!用EPLAN 3D布局图,手把手教你搞定电气柜的3D建模与自动布线 本文详细介绍了如何使用EPLAN 3D布局图进行电气柜的3D建模与自动布线,帮助工程师告别混乱接线。从项目准备、基础结构建模到智能设备布局与逻辑定义,再到高级布线技术与问题排查,提供了一套完整的实战指南。通过EPLAN的3D功能,显著提升设计效率与系统可靠性。 阅读详情

相关推荐

配置权重_高盛都在用的资产配置模型,BL贝叶斯框架改进Markowitz

前面我们说到,markoviz的均值-方差模型,第一次,用数学的方式严格证明了投资组合存在最优的权重,但它的学术意义大于实战。主要原因有两个:1,人们很难有效的预测期望收益率;2,最优资产组合配置对输入非常敏感,结果往往难以被人理解。还有就是在投资中,定量只是完成初步构建,同步的定性判断依然非常重要:第一,投资者的认知偏好:倾向于关注他们认为被低估,但有发展潜力或者可以确定相对交易价值的小部分股票...

weixin_39892309的博客 715

细说setTimeout/setImmediate/process.nextTick的区别

node.js中的非IO的异步API提供了四种方法,分别为setTimeOut(),setInterval(),setImmediate()以及process.nextTik(),四种方法实现原理相似,但达到的效果略有区别:一、事件循环Event Loop首先,我们需要了解node.js的基于事件循环的事件模型,正是因为它才使得node.js中回调函数十分普遍,也正是基于此,node.js实现了单线

2万+

carsim软件教学

第一步打开小锁(红色标注) 新手往往一看界面是灰的,界面内的各种模块打开不了,以为没激活成功 所有模块必须复制之后,进行编辑,不要直接进行修改(很重要) 2.空气动力学模型(红色标注) 这里面主要设定了簧上质量。整车的整备质量在下图模块中进行设定 空气动力学。主要涉及到空气阻力,在下面模块中进行设定,有个问题需要注意,他的空气阻力与汽车理论的空气阻力公式不一致,这一点需要注意 下面这会模块基本上用不到,涉及到一个声音和汽车的外观 下面这个模块主要涉及到发动机功率,传动比还有 tao,档位的传动比,发

weixin_43796045的博客 2551

4 / 8 node中的 setTimeout 和 setImmediate 有什么区别

前面的话 前端日问,巩固基础,不打烊!!! 解答 首先两者都是定时器,在node中有4种定时器: setTimeout setInterval setImmediate process.nextTick 在node中,I/O处理方面有自己的libuv引擎,libuv引擎中事件循环分为6个阶段: timers阶段: 执行timer(setTimeout 、setInterval)的回调 po...

小柒的前端之旅 3268

uniapp+萤石视频监控实战:解决ezuikit.js真机调试不显示的5个关键步骤

本文针对Uniapp集成萤石视频监控时ezuikit.js在真机调试中黑屏不显示的问题,提供了5个关键解决步骤。核心方案是采用Webview加载独立H5播放页,以规避跨平台环境差异,并详细阐述了资源放置、多端适配、通信处理及系统化排查方法,确保视频流稳定播放。

weixin_29001655的博客 287

Calibre license失效的解决方法

Calibre license失效的解决方法

qq_45354630的博客 6481

setTimeout,setInterval,setImmdeiate的区别

需要注意的是,`setImmediate` 并不是标准 JavaScript 的一部分,它通常只在一些特定的环境中可用,如 Node.js。- `setImmediate` 用于在当前事件循环的下一个迭代中执行一个函数,尽可能快地执行。- `setImmediate` 尽可能快地在当前事件循环的下一个迭代中执行函数。- `setInterval` 用于在一定的时间间隔内重复执行一个函数。- `setTimeout` 在指定的延迟时间后执行函数,只执行一次。- 它接受两个参数:要执行的函数和延迟的毫秒数。

qq_56918166的博客 1407

(功能安全六)硬件FMEDA计算

FMEDA(故障模式、影响与诊断分析)是功能安全验证的核心方法,通过量化分析硬件故障模式及其影响,计算SPFM、LFM、PMHF等关键指标。分析过程包含六大步骤:计算元器件失效率、识别故障模式、评估安全机制诊断覆盖率、分类计算各类失效率、量化指标计算及设计优化。输入需要系统架构图、硬件故障模式清单等资料,输出安全指标达标情况及改进建议,确保设计满足ASIL等级要求。该方法通过系统化的故障分类和量化评估,为硬件安全设计提供科学依据。

Dayongger的博客 1451

setTimeout/setImmediate/process.nextTick的差别

  前言 根据上一篇文章,我们可知,node对回调事件的处理完全是基于事件循环的tick的,因此具有几大特征: 1、在应用层面,JS是单线程的,业务代码中不能存在耗时过长的代码,否则可能会严重拖后续代码(包括回调)的处理。如果遇到需要复杂的业务计算时,应当想办法启用独立进程或交给其他服务进行处理。 2、回调是不精确,因为前面的原因,setTimeout并不能得到准确的超时回调。 3、不...

Meiko记录 868

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 597

SAP 合并报表(EC-CS)完整方法论 + 全业务操作步骤

SAP合并报表(EC-CS)方法论与操作指南摘要 SAP EC-CS模块提供完整的集团合并解决方案,其核心方法论基于会计准则和集团管控逻辑,通过6大维度构建标准化合并体系:组织架构标准化、数据采集标准化、外币换算规则化、内部交易自动化抵消、股权与商誉规范化、报表出具灵活化。 实施过程分为两个阶段: 上线前配置阶段(12个步骤):包括合并架构搭建、科目表配置、外币规则设定、抵消规则定义等基础工作 日常操作阶段(10个步骤):涵盖数据报送、外币换算、内部对账、自动抵消、调整分录等月结流程 系统优势包括: 支持多

金牌架构师 1365

Node.js 入门教程 29 了解 process.nextTick() & 30 了解 setImmediate() & 31 探索 JavaScript 定时器

Node.js 入门教程 29 了解 process.nextTick() & 30 了解 setImmediate() & 31 探索 JavaScript 定时器

代码改变世界 542

2025年9月GESP(C++四级):排兵布阵

作为将军,你自然需要合理地排兵布阵。地图可以视为n行m列的网格,适合排兵的网格以 1 标注,不适合排兵的网格以 0 标注。现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?

王老师青少年编程 1380

node中定时器, process.nextTick(), setImediate()的区别与联系

1.定时器   setTimeout()和setInterval()与浏览器中的API是一致的,定时器的问题在于,他并非精确的(在容忍范围内)。尽管事件循环十分快,但是如果某一次循环占用的时间较多,那么下次循环时,他也许已经超时很久了。比如通过setTimeout()设定一个任务在10毫秒后执行,但是在9毫秒后,有一个任务占用了5毫秒的cpu时间片,再次轮到定时器执行时,时间就已经过期4毫秒。 ...

weixin_30521161的博客 347

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

setTimeout/setImmediate/process.nextTick的区别

node.js中的非IO的异步API提供了四种方法,分别为setTimeOut(),setInterval(),setImmediate()以及process.nextTick(),四种方法实现原理相似,但达到的效果略有区别: 一、事件循环Event Loop 首先,我们需要了解node.js的基于事件循环的事件模型,正是因为它才使得node.js中回调函数十分普遍,也正是基于此,node.j...

huyao的博客 260

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

详解 setTimeout、setImmediate、process.nextTick 的区别

setTimeout、setImmediate、process.nextTick 事件循环 Event Loop

weixin_39489765的博客 1309

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop

笔者以前面试的时候经常遇到写一堆setTimeout,setImmediate来问哪个先执行。本文主要就是来讲这个问题的,但是不是简单的讲讲哪个先,哪个后。笼统的知道setImmediate比setTimeout(fn, 0)先执行是不够的,因为有些情况下setTimeout(fn, 0)是会比setImmediate先执行的。要彻底搞明白这个问题,我们需要系统的学习JS的异步机制和底层原理。本文就会从异步基本概念出发,一直讲到Event Loop的底层原理,让你彻底搞懂setTimeout,setImme

飞翔的熊blabla 2506

Node.js中setTimeout,setImmediate和process.nextTick的区别

原文链接:https://blog.csdn.net/hkh_1012/article/details/53453138 node.js中的非IO的异步API提供了四种方法,分别为setTimeOut(),setInterval(),setImmediate()以及process.nextTick(),四种方法实现原理相似,但达到的效果略有区别: 一、事件循环Event Loop 首先,我们需要了解node.js的基于事件循环的事件模型,正是因为它才使得node.js中回调函数十分普遍,也正是基于此,nod

qq_43293207的博客 328

nextTick, setTimeout 以及 setImmediate 三者的执行顺序

这个问题是有关执行顺序和Event Loop的。关于Event Loop和任务队列等概念,可以先阅读我引用中的文章,本文主要分析一些存在的疑惑点。 下面这个例子比较典型: setImmediate(function(){ console.log(1); },0); setTimeout(function(){ console.log(2); },0); new Promise(fu...

miaomiao_1024的博客 1683

微宏任务执行顺序比较,promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序

先举一个比较典型的例子: setImmediate(function(){ console.log(1); },0); setTimeout(function(){ console.log(2); },0); new Promise(function(resolve){ console.log(3); resolve(); console.log(4); }).then(function(){ console.log(5); }); console.log(6); process.n

Jonathan的博客 2300

node中的setTimeout,setInterval,promise.then和process.nextTick()的执行顺序

1.javascript事件循环: 同步任务:直接通过主线程执行,如script代码 异步任务:进入Event Table,并注册回调函数——> Event Queue,等主线程的执行栈为空时候,读取Event Queue里面的函数就,进入主线程。如setTimeout,promise.then()等; 那怎么知道主线程的执行栈为空呢,JS引擎存在monitoring process进程,它会持续检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。

Moments 1528

nodejs的setTimeout与setImmediate执行顺序问题

版本与依赖 node: v12.16.2 在nodejs中setTimeout、setInterval、setImmediate、nextTick都是异步执行的,在执行过程中肯定会存在执行先后顺序的问题,具体的执行情况可以总结如下: setTimeout与setInterval setTimeout和setInterval属于同级关系,回调都在timers phase执行,执行的先后顺序取决于设置的millisec参数,设置的时间长的后执行 设置时间相同时,则与定义时间相关,先出现的先执行 const t

weixin_42688362的博客 1321

SetTimeout、SetInterVal、setImmediate和process.nextTick的理解

起航 以前都是在掘金上看别人的文章,好的点个赞。逛github的时候,也只是喜欢看别人源码,也从不在git上上传东西。今天突然萌发了自己想要发一些东西,方便自己以后查阅,也能让大家指点一下,是否正确。免得在错误的道路上越走越远,还和正确的人争论的面红耳赤。毕竟一旦确立了错误的观点,那么错误的观点就会在你潜意识里变成正确的了。 疑问 正常情况下,setTimeout、setInterval、se...

weixin_34050389的博客 1102
上一篇: node.js中的http+https模块
下一篇: node.js中的module模块
晶球
博客等级 码龄9年 4粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值