温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

nodejs中setTimeout(fn,0)和setImmediate哪个先执行

发布时间:2021-07-21 09:06:44 来源:亿速云 阅读:128 作者:Leah 栏目:大数据

今天就跟大家聊聊有关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哪个先执行有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI