4

我的 javascript 中有一个 setinterval 函数,我希望它尽可能快,即每 1 毫秒检查一次事件的状态。这是否可能对用户的浏览器提出太多要求?它似乎工作得很好,但我想知道它是否是一种不好的做法。

4

6 回答 6

8

这不仅是可能的,而且很常见。就其本质而言,这是一种竞争条件。如果您依赖回调中的代码在下一个间隔之前执行,请改用递归setTimeout

此外,除非您的间隔被调用,否则lockUpBrowser回调之间的持续时间可能太短,无法进行实际的性能处理。

(function myRecursiveTask() {
    // Do your task here
    myTask();

    if (!someConditionToAllowABailOut) {
        setTimeout(myRecursiveTask, 100); // 100ms loop
    }
}());
于 2012-10-27T00:14:34.023 回答
4

setInterval不能保证在指定的时间间隔内精确执行。它将尽快执行,但由于 javasript 是单线程的,并且此时可能会执行一些其他代码,因此您的回调可能会延迟。

如果您使用setInterval1ms,那么您可能试图以错误的方式解决您的问题。

于 2012-10-27T00:12:06.193 回答
1

是的,如果传递给的函数引用setInterval的执行时间比间隔时间长,则对该函数的调用将排队并阻塞浏览器。如果您正在尝试执行动画并希望尽可能快地更改每个步骤,那么有一个requestAnimationFrame功能应该用于现代浏览器。就个人而言,我从来不需要比每个15ms.

于 2012-10-27T00:12:16.540 回答
1

我当然会质疑这种方法的必要性。您需要每 1 毫秒检查哪些您无法每 10 毫秒、100 毫秒或每秒检查一次的内容?

您是否 100% 确定您将每次运行的检查功能将始终在 < 1 毫秒内执行,这样您就不会有多个检查进程叠加运行。

该过程需要多少内存和 CPU,您是否可能会降低用户浏览器的速度,以至于滚动等简单的操作对用户来说变得很痛苦?

于 2012-10-27T00:13:26.860 回答
0

一个while循环对你来说太慢了吗?

while (condition)
  {
  //code block to be executed
  }

我知道我不是在回答你的问题,但我认为没有更好的方法来做这样的事情......

于 2012-10-29T06:07:25.753 回答
0

Ben Cherry 对此有一篇很好的文章,他在其中测试了不同的浏览器,以了解setInterval在它变得不可靠之前可以多快。setIntervala or触发的速度setTimout取决于浏览器。

特别是,如果您正在寻找跨浏览器的一致计时器间隔,则必须使用 >15ms 的时间。

因此,如果您可以将时间设置为大于 15 毫秒,您将不会遇到问题。

于 2016-09-09T01:59:57.323 回答