2011-10-12 51 views
0

考虑通过setTimeout/setInterval定期执行后台任务的应用程序。一个函数调用应该完成多少工作?Javascript:使用setInterval进行后台任务的理想块大小?

例子:

myTask = function() { 
    for (var i=0; i<chunkSize; i++) { ...work... } 
} 

setInterval(myTask, period); 

如果增加chunkSize(做每个呼叫更多的迭代),当然它会运行的时间更长。这意味着,period也将不得不增加,你可以不经常调用该函数。但我发现,尽管如此,块越大,工作就越多。这可能是由于setTimeout/setInterval

权衡是开销:较大的块大小使应用程序的反应性较低。这不仅涉及用户交互,还涉及其他间隔。因为只要函数正在运行迭代,就不会触发其他时间间隔。因此,大块大小会导致其他间隔不够精确,或者(在最坏的情况下)会在某些浏览器中完全禁用它们,以免它们再被调用。

如果你想

  • 最大化的工作得到完成
  • 尽量减少对其他区间不良影响,使他们准确

什么是实现这一目标的最佳途径是多少?你如何确定一个好的块大小?还是应该监视循环中的执行时间并在一定时间后中止?或者是其他东西?

(顺便说一句,这是关于普通的旧的JavaScript,HTML5不WebWorkers)

+1

为什么你不使用工作线程呢?我个人会使用reverse-AJAX,因为回调是首先异步执行的,但我喜欢使事情复杂化:D – Art

+1

为什么不使用工作线程? 1),因为它们不受旧版浏览器的支持。 2)因为我的作业共享数据对象。这对于工作者线程来说是不可能的,除非你继续序列化和反序列化它们,这会造成主要开销和同步问题。 – travelboy

回答

2

如果可以的话,你应该使用setTimeout而不是setIntervalsetInterval将在period之后调用该功能,以确定前一间隔的功能是否完整。通过setTimeout,您可以确保该功能在再次调用之前完成。

(function myTask() { 
    for (var i=0; i<chunkSize; i++) { ...work... } 
    setTimeout(myTask, period); 
})();