当前位置: 首页 > 面试题库 >

Node.js是否对setTimeout强制执行最小延迟?

充培
2023-03-14
问题内容

在浏览器中,如果setTimeout从调用的函数中使用,setTimeout则将强制执行至少4ms的延迟。Mozilla的开发人员Wiki
描述了此行为,并提到该行为已在HTML5中标准化。

Node.js的文档setTimeout未提及最小延迟。但是,该函数的文档将其process.nextTick描述为的更有效的替代方法setTimeout(fn, 0)。这表明它有更高的效率,因为它避免了这种延迟。否则setTimeout(fn, 0)可能会被优化以表现出相同的行为。

是否像网络浏览器一样,Node.js对setTimeout实施了最小延迟?


问题答案:

它没有最小延迟,这实际上是浏览器和节点之间的兼容性问题。计时器在JavaScript中是完全未指定的(这是DOM规范,它在Node中没有用,甚至浏览器也没有遵循),而node实现它们的原因仅仅是因为它们在JavaScript的历史上具有多么基础,以及它们在其他方面的替代性。

Node使用libuv,libuv是跨平台的抽象层,用于较低级别的系统(例如文件系统,网络等)。计时器是其中之一,Node提供了最少的包装。在libuv级别,使用的计时器是系统特定的高精度计时器。例如,在Windows中,使用来实现此功能QueryPerformanceFrequencyFileTimeToSystemTime并提供以纳秒为单位的分辨率。

在Node中,如果指定setTimeout(callback, 1),它将在一毫秒后执行(假设系统不会因为不堪重负而延迟)。在浏览器中,最短时间为HTML5规范指定的4毫秒:https
:
//developer.mozilla.org/en/DOM/window.setTimeout。这不是保证的时间,只是最短的时间。可以预期大多数浏览器的分辨率约为15ms,这会影响DOM动画。

一个有效的信息是,在同一帧内设置为相同毫秒的超时将按照它们排队的顺序执行。如果要这样做:

  setTimeout(callback1, 1);
  setTimeout(callback2, 1);
  setTimeout(callback3, 1);
  setTimeout(callback4, 1);

总而言之,Node应该按该顺序调用它们。仅当它们具有完全相同的解析时间时才适用。

http://msdn.microsoft.com/zh-
CN/library/windows/desktop/ms644905(v=vs.85).aspx

http://msdn.microsoft.com/zh-
CN/library/windows/desktop/ms724280(v=vs.85).aspx



 类似资料:
  • 问题内容: 考虑以下示例: 是什么导致该执行 立即 ,而不是等待3秒为单位设置,以及只执行警戒 ONCE ,而不是在计划每隔5秒? 感谢您的任何帮助,您可以提供! 石匠 问题答案: 这看起来不像立即调用函数吗? 尝试传递函数(不执行):

  • 问题内容: 具体说说(服务器端)V8,并假设我不担心准确性,因为我可以检测和补偿它,那么我可以使用setTimeout 逐字 间隔设置几千个相对简单的超时,而无需面对任何其他限制除了RAM以外?如果我要使用一个在任何给定时间可能有数千个计划的超时的系统,我应该注意什么吗? 作为记录,我已经阅读了John’s Resig关于Javascript计时器如何工作的出色文章,因此无需指出那里已经介绍的内容

  • 我正在学习这篇docker教程,并遇到了docker编写的麻烦。问题是当我运行时,web容器无法连接到es容器,在几次失败的重试后,它放弃并死亡(然后web容器自行退出)。 然而,从日志来看,这似乎是因为es容器刚刚开始使用--如果我在此之后重复(一旦es已经启动并运行),web容器就可以正常工作。 所以我想知道,有没有一种方法可以从docker-compose.yml文件中指定启动容器之间的时间

  • 问题内容: 假设提供了以下映射: Java类: 是否可以更改Hibernate映射,以便 在启动时仍由Hibernate强制并创建外键 ,但类如下所示: 我知道,如果我将其转换为a 可以使用,但是数据库不会强制使用外键。 我需要执行此操作,因为对象可能会(或可能不会)单独初始化,这有时会导致 在调用时发生异常。我希望将其作为,并在必要时加载整个对象。这也将使对象的加载更快。 我相信我的问题与这一问

  • 我试图在flutter中创建一个布局,由一行和两个子小部件组成,第一个子部件向左对齐,第二个子部件向右对齐,如果容器太窄,这也将包装小部件。 这类似于这里提出的问题:Flutter将两个项极端地对齐--一个在左边,一个在右边,这可以通过小部件来解决,小部件具有。然而,当小部件使用此方法包装时,包装到新运行的右小部件不再右对齐。(截图) 我希望发生的是,右边的小部件在包装时保持与右边对齐。在使用fl

  • 我在HashMap中存储的对象作为键覆盖equals(),但不是hashCode();当我在映射中放置一个对象时,equals()方法没有被调用。如果我还重写hashCode(),则会调用equals()方法。为什么? 为什么我不能使用自定义的equals方法来阻止向映射中添加对象,而不管我是否重写hashCode()? 谢谢 如果注释了hashCode(),则大小为2,否则大小为1。 我在想,如