如果我想在无法继续处理数据的情况下暂停 Web Worker 并稍后再试怎么办?我可以在 Web Worker 中以这种方式执行此操作吗?
var doStuff = function() {
if( databaseBusy() ) {
setTimeout(doStuff, 1000);
} else {
doStuffIndeed();
}
}
我遇到了Uncaught RangeError: Maximum call stack size exceeded 一些事情告诉我这是因为上面的代码。
最佳答案
如果“暂停”是指 “对 worker.postMessage()
的进一步调用将排队并且不被工作人员处理”,那么不,你不能为此使用 setTimeout()
。 setTimeout()
不是 busywait,而是一种线程内机制,用于将工作延迟到稍后的预定时间。 Web Worker 仍然会在发布后立即从主队列收到一个新的 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);
}
- 每次收到消息时,worker 都会将其放入队列并调用
tryToProcess
。 tryToProcess
只要数据库可用,一次从队列中拉取一条消息。- 如果数据库不可用并且还有消息,它会在 1 秒后重试。
关于javascript - 来自 Web Worker 的 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22043120/