繁体   English   中英

来自web worker的setTimeout

[英]setTimeout from a web worker

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

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

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

如果通过“暂停”意味着“对worker.postMessage()进一步调用将排队并且不被工作者处理” ,那么不,你不能使用setTimeout() setTimeout()不是busywait,而是一种内联机制,用于将工作延迟到稍后的计划时间。 一旦发布,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秒内再次尝试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM