[英]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.