nodejs中setTimeout(fn,0)和setImmediate哪个先执行
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,今天就跟大家聊聊有关nodejs中setTimeout(fn,0)和setImmediate哪个先执行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所
千家信息网最后更新 2026年11月01日nodejs中setTimeout(fn,0)和setImmediate哪个先执行
今天就跟大家聊聊有关nodejs中setTimeout(fn,0)和setImmediate哪个先执行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
我们首先看一下下面这段代码
setTimeout(()=>{ console.log('setTimeout'); },0)
setImmediate(()=>{ console.log('setImmedate');})
我们执行上面这段代码,会发现输出是不确定的。下面来看一下为什么。
nodejs的事件循环分为几个阶段(phase)。setTimeout是属于定时器阶段,setImmediate是属于check阶段。顺序上定时器阶段是比check更早被执行的。在分析nodejs的setImmediate和setTimeout的文章中已经介绍过这两个函数对应的实现原理。这里就不细说了。其中setTimeout的实现代码里有一个很重要的细节。
after *= 1; // coalesce to number or NaN
if (!(after >= 1 && after <= TIMEOUT_MAX)) {
if (after > TIMEOUT_MAX) {
process.emitWarning(`${after} does not fit into` +
' a 32-bit signed integer.' +
'\nTimeout duration was set to 1.',
'TimeoutOverflowWarning');
}
after = 1; // schedule on next tick, follows browser behavior
}
我们发现虽然我们传的超时时间是0,但是0不是合法值,nodejs会把超时时间变成1。这就是导致上面的代码输出不确定的原因。我们分析一下这段代码的执行过程。nodejs启动的时候,会编译执行上面的代码,开始一个定时器,挂载一个setImmediate节点在队列。然后进入libuv的事件循环,然后执行定时器阶段,libuv判断从开启定时器到现在是否已经过去了1毫秒,是的话,执行定时器回调,否则执行下一个节点,执行完其他阶段后,会执行check阶段。这时候就会执行setImmediate的回调。所以,一开始的那段代码的输出结果是取决于启动定时器的时间到libuv执行定时器阶段是否过去了1毫秒。
看完上述内容,你们对nodejs中setTimeout(fn,0)和setImmediate哪个先执行有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
定时器
阶段
代码
内容
时间
输出
事件
节点
面的
分析
循环
合法
重要
两个
函数
原因
原理
取决于
就是
文章
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
什么是科技互联网
有格互联网科技
新华互联网科技学校
科技和互联网公司
猪兼强互联网科技
一五八零互联网科技
金融科技和互联网金融
电子科技大学互联网创业大赛
卓翼科技产业互联网合作
互联网金融科技名词解释
济南有互联网科技公司吗
群盈汇互联网科技有限公司
美国互联网科技实力
萌小萌互联网科技河南有限公司
全球科技与互联网公司市值变化
西安左小互联网科技有限公司
北京互联网科技类企业分布
科技信息时代互联网发展
互联网科技品牌
互联网科技创业计划的风险分析
蓝思科技飞鸽互联网
江苏根荣互联网科技
互联网科技深圳
远拓互联网科技
奔汉互联网科技
互联网科技与管理
江苏苏星互联网科技有限公司
半导体是互联网高科技吗
数字科技和互联网金融哪个好
恒生科技互联网指数十大成分股