来自web worker的setTimeout

时间:2014-02-26 13:38:30

标签: javascript web-worker

如果我不想继续处理数据,我想暂停网络工作,如果稍后再尝试,该怎么办?我可以在网络工作者中以这种方式做到这一点吗?

var doStuff = function() {
    if( databaseBusy() ) {
        setTimeout(doStuff, 1000);
    } else {
        doStuffIndeed();
    }
}

我得到未捕获的RangeError:超出最大调用堆栈大小,因为上面的代码,有些东西告诉我它。

1 个答案:

答案 0 :(得分:2)

如果通过“暂停”表示“对worker.postMessage()的进一步调用将排队等待,而不是由工作人员处理”,那么不,您不能使用setTimeout()这个。 setTimeout()不是忙碌,而是一种线程机制,用于将工作延迟到稍后的预定时间。一旦发布,Web工作者仍将从主队列中收到新的onmessage事件。

但是,您可以手动排队并使用setTimeout尝试稍后处理它们。例如:

<强> worker.js

var workQueue = [];
addEventListener('message',function(evt){
  workQueue.push(evt.data);
  doStuff();
},false);

function doStuff(){
  while (!databaseBusy()) doStuffIndeed(workQueue.shift());
  if (workQueue.length) setTimeout(doStuff,1000);
}
  • 每次收到消息时,工作人员都会将其放入队列并调用tryToProcess
  • 只要数据库可用,
  • tryToProcess就会一次从队列中提取消息。
  • 如果数据库不可用且有剩余消息,则会在1秒内再次尝试。