javascript - 来自 Web Worker 的 setTimeout

标签 javascript web-worker

如果我想在无法继续处理数据的情况下暂停 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/

相关文章:

javascript - 选择所有级别的所有 child

javascript - 避免在 then 函数 JS 中嵌套 Promise

javascript - 为什么这些 Jest 不会重置?

reactjs - 如何模拟网络 worker 以在 react 测试库中进行测试?

javascript - 将对象传递给网络 worker

javascript - Polymer2 + Firebase : TypeError class extends value undefined, 不是构造函数或 null

javascript - 如何按类获取元素? html单元

javascript - 将项目插入数组的最佳性能方法?

javascript - 我可以从 Windows 10 (UWP) 应用程序中的 Web Worker 调用自定义运行时组件吗

javascript - 在 Web Worker 仍在运行时向其发送消息