一个可靠的Javascript计时器

时间:2013-12-08 13:10:54

标签: javascript

我有一个网站,我正在使用javscript计时器交换图像。

我正在使用这样的计时器:

var myTimer = window.setTimeout(MyFunction, MyInterval);

function MyFunction
{
//do something
//recalll timer
}

现在,我遇到的问题不是间隔不会定期发射,因为我可以在我的应用程序中接受它,并且我理解它为什么会变化。

我遇到的问题是,计时器会不时停止几秒钟,然后重新开始。

我正在尝试确定这种随机暂停计时器的主要原因是什么?

是否由于资源被转移到托管浏览器PC上的另一个进程,还是仅仅是使用JavaScript计时器的本质?

如果后者应该做一个永恒的循环?我阅读并在其他地方实践过的每个地方都表明无限循环会占用所有资源,这将比定时器随机暂停更加邪恶。

当定期快速执行代码至关重要时,是否有使用javascript计时器的替代方法?

由于

2 个答案:

答案 0 :(得分:2)

您在MyFunction内运行的代码需要一些时间来执行(取决于您正在做什么)。当您在该函数结束时调用计时器时,由于添加了代码执行时间,因此间隔不完全是MyInterval。 如果使用setInterval()而不是setTimeout(),则给定的函数将在MyInterval毫秒而不是(MyInterval + execution time)毫秒内执行。

要回答您的问题,随机暂停的发生是因为代码的执行时间。

答案 1 :(得分:1)

我在一个正在研究的网站上遇到了类似的问题,并最终在jQuery插件中发现了另一个定时器触发的工作的罪魁祸首,该插件偶尔延迟执行我自己的功能。如果您在站点中使用外部代码,则可以进行一些调试以查看是否也是这种情况。

作为一种可能的补救措施,您可以查看web workers。由于工作任务是在一个独立的线程中执行的,因此当主线程中的某些内容需要很长时间才能完成时,它们不会出现延迟。

您的代码将如下所示:

var worker = new Worker('worker.js');

在另一个名为“worker.js”的文件中,你会写:

var myTimer = setTimeout(MyFunction, MyInterval);

function MyFunction
{
//do something
//recalll timer
}

请注意,window.之前不再有setTimeout。这是因为Web工作者无法直接访问DOM。

不能保证解决您的问题,但值得测试。