2011-07-27 45 views
3

我希望能够通过JavaScript在浏览器中完成一大堆工作,以使浏览器始终保持响应。检查一个JavaScript setTimeout是否已经触发

我试图采取的方法是大块的工作,传递每个块到一个函数,然后排队与setTimeout(func, 0)调用。

我需要知道何时完成所有工作,所以我将返回的计时器ID存储在地图中(id - > true | false)。这个映射在我有定时器ID之后在下一个代码块中被设置为false,并且当它完成时,排队函数将映射设置为true,当然,排队函数当然不知道它的定时器ID。

也许有一个更好/更简单的方法......或一些建议,我可以如何操纵我的地图,因为我需要?

回答

6

我会在数组中排队工作,使用一个超时来处理队列并在队列为空时调用回调。喜欢的东西:

var work = [...]; 

var run = function(work, callback) { 
    setTimeout(function() { 
     if(work.length > 0) { 
      process(work.shift()); 
      setTimeout(arguments.callee, 25); 
     } 
     else { 
      callback(); 
     } 
    }, 25); 
}; 

run(work, function() { 
    alert('Work is done!'); 
}); 

如JavaScript在浏览器中是单线程的,没有运行多个超时(至少我认为这是你在做什么)真正的优势。它甚至可能会减慢浏览器速度。

+0

好的,所以我认为主要的不同之处在于,这种方法递归地设置下一个工作项目超时,因为当前项目完成,而不是在所有项目上预先设置超时并检查完成。我可以试试...干杯 – Brabster

+0

工作一种享受,非常感谢。 – Brabster

1

我想补充说的是,尽管javascript是单线程的,但仍然可以同时执行多个ajax调用。我最近有一个网站需要做潜在的数百个Ajax调用,而浏览器无法处理它。我创建了一个使用setTimeOut一次运行5个调用的队列。当其中一个ajax调用返回时,它会触发一个回调(由单个线程处理),然后在堆栈上进行下一次调用。

想象一下,您是一位只能同时与一个人交谈的经理,您可以给予5个员工任务,然后等待他们的回复,这些回复可能会以任何顺序进行。一旦第一名员工回来并给你提供信息,你就给他们一个新的任务,并等待下一名员工(或者甚至是同一名员工)回来。所以,虽然你是“单线程”,但5件事情正在一次发生。