setTimeOut()和setInterval()在节点

如果我从现在起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中的定时器事件不能保证在准确的时间被调用。

如果我从现在起10秒内调用setTimeOut(),那么执行一组长时间运行的命令,Node.js / JavaScript是否等待,直到这些命令完成执行setTimeOut中设置的函数?

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

与setInterval()是一样的吗?

是的, setInterval()机制相同。

以下是关于node.js系统如何工作的一些解释。

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

当你使用setTimeout()或者setInterval() ,node.js里面的一些内部机制使用系统定时器来知道下一个定时器应该何时触发。 此时,一个事件被插入到node.js事件队列中。 如果node.js此时什么都不做,那么这个事件立即被触发,并立即调用相应的callback函数。

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

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

所以,如果你有一些长时间运行的node.js代码,它会阻塞所有其他事件(包括计时器事件),直到完成,node.js可以返回到事件队列的下一个事件。

答案是:也许但可能不是。

当事情是asynchronous的时候,不一定能保证什么时候会被调用。 当asynchronous的东西被调用,它会被添加到一个内部的队列,它会处理队列。 可能性是,他们会完成,但这不是你应该依靠的。

相反,你应该做的是触发某些东西来明确表示完成。 有很多方法可以去做,比如callback和Promises 。 你甚至可以设置一个指示状态的布尔值,并在依赖步骤之前检查它。

 let aDone = false; setTimeout(() => { aDone = true; }, 1000); const startInterval = () => { if (!aDone) { setTimeout(startInterval, 200); // try again in 200ms } setInterval(() => { /* do something */ }, 1000); }; startInterval(); // kick off the interval check