This question already has answers here:
How does setTimeout work in Node.JS?
                                
                                    (5个答案)
                                
                        
                                3年前关闭。
            
                    
如果我说从现在开始10秒钟调用setTimeOut(),然后执行一组长时间运行的命令,Node.js / JavaScript是否会等到这些命令完成了setTimeOut中设置的功能后才开始执行? setInterval()是否相同?

如果我在代码中同时使用setTimeOut()和setInterval(),是否有任何需要注意的地方,而这些任务最终可能会在同一时间执行?

我正在使用node-cron(https://github.com/kelektiv/node-cron/blob/master/lib/cron.js)库,并且看到它使用setTimeOut。我正在尝试使用setInterval()添加一些任务。

最佳答案

不能保证在准确的时间调用node.js中的计时器事件。


  如果我说setTimeOut()从现在开始10秒钟,则执行
  一组长期运行的命令,Node.js / JavaScript是否等到那些
  命令完成执行setTimeOut中设置的功能?


是的,它等待直到在node.js中执行的当前代码完成后,才能提供下一个计时器事件。


  setInterval()是否相同?


是的,setInterval()的机制相同。

这是对node.js系统如何工作的一些解释。

node.js是一个单线程事件驱动的系统(技术上,线程是在node.js内部使用的,但是它仅运行JS代码中的一个线程)。

当您使用setTimeout()setInterval()时,node.js内部的某些内部机制会使用系统计时器来了解何时应触发下一个计时器。那时,一个事件被插入到node.js事件队列中。如果那时node.js没有执行任何操作,那么将立即触发该事件,并立即调用相应的回调函数。

但是,如果node.js忙于运行代码,并且其他事件位于事件队列中的timer事件之前,则不会立即触发timer事件。

相反,node.js将等待,直到完成了node.js中的当前执行线程,然后,只有这样,事件队列中的下一个事件才会被拉出,并且将调用该事件的相应回调。

因此,如果您有一段长时间运行的node.js代码,它将阻止所有其他事件(包括计时器事件)直到完成,并且node.js可以返回将下一个事件从事件队列中拉出。

10-05 21:03
查看更多