簡體   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