[英]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
一次從隊列中提取消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.