Mis*_*rev 5 javascript web-worker
如果我想在无法继续处理数据的情况下暂停 Web Worker,然后稍后再尝试,该怎么办?我可以在网络工作者中以这种方式做到这一点吗?
var doStuff = function() {
if( databaseBusy() ) {
setTimeout(doStuff, 1000);
} else {
doStuffIndeed();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到Uncaught RangeError:超出最大调用堆栈大小,有人告诉我这是因为上面的代码。
如果“暂停”的意思是“进一步的调用worker.postMessage()将排队并且不被工作人员处理”,那么不,你不能用于setTimeout()此目的。setTimeout()不是繁忙等待,而是一种线程内机制,用于将工作延迟到稍后的计划时间。onmessage一旦发布新事件,Web Worker 仍会立即从主队列接收新事件。
但是,您可以做的是手动将它们排队并使用 setTimeout 稍后尝试处理它们。例如:
工人.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);
}
Run Code Online (Sandbox Code Playgroud)
tryToProcess.tryToProcess只要数据库可用,就一次从队列中提取一条消息。| 归档时间: |
|
| 查看次数: |
12858 次 |
| 最近记录: |