我的 javascript 中有一个 setinterval 函数,我希望它尽可能快,即每 1 毫秒检查一次事件的状态。这是否可能对用户的浏览器提出太多要求?它似乎工作得很好,但我想知道它是否是一种不好的做法。
6 回答
这不仅是可能的,而且很常见。就其本质而言,这是一种竞争条件。如果您依赖回调中的代码在下一个间隔之前执行,请改用递归setTimeout
。
此外,除非您的间隔被调用,否则lockUpBrowser
回调之间的持续时间可能太短,无法进行实际的性能处理。
(function myRecursiveTask() {
// Do your task here
myTask();
if (!someConditionToAllowABailOut) {
setTimeout(myRecursiveTask, 100); // 100ms loop
}
}());
setInterval
不能保证在指定的时间间隔内精确执行。它将尽快执行,但由于 javasript 是单线程的,并且此时可能会执行一些其他代码,因此您的回调可能会延迟。
如果您使用setInterval
1ms,那么您可能试图以错误的方式解决您的问题。
是的,如果传递给的函数引用setInterval
的执行时间比间隔时间长,则对该函数的调用将排队并阻塞浏览器。如果您正在尝试执行动画并希望尽可能快地更改每个步骤,那么有一个requestAnimationFrame
功能应该用于现代浏览器。就个人而言,我从来不需要比每个15ms
.
我当然会质疑这种方法的必要性。您需要每 1 毫秒检查哪些您无法每 10 毫秒、100 毫秒或每秒检查一次的内容?
您是否 100% 确定您将每次运行的检查功能将始终在 < 1 毫秒内执行,这样您就不会有多个检查进程叠加运行。
该过程需要多少内存和 CPU,您是否可能会降低用户浏览器的速度,以至于滚动等简单的操作对用户来说变得很痛苦?
一个while循环对你来说太慢了吗?
while (condition)
{
//code block to be executed
}
我知道我不是在回答你的问题,但我认为没有更好的方法来做这样的事情......
Ben Cherry 对此有一篇很好的文章,他在其中测试了不同的浏览器,以了解setInterval
在它变得不可靠之前可以多快。setInterval
a or触发的速度setTimout
取决于浏览器。
特别是,如果您正在寻找跨浏览器的一致计时器间隔,则必须使用 >15ms 的时间。
因此,如果您可以将时间设置为大于 15 毫秒,您将不会遇到问题。