来自网络工作者的 setTimeout

2023-12-29

如果我想在无法继续处理数据的情况下暂停 Web Worker,然后稍后再尝试,该怎么办?我可以在网络工作者中以这种方式做到这一点吗?

var doStuff = function() {
    if( databaseBusy() ) {
        setTimeout(doStuff, 1000);
    } else {
        doStuffIndeed();
    }
}

我越来越未捕获的范围错误:超出最大调用堆栈大小有些东西告诉我这是因为上面的代码。


如果“暂停”你的意思是“进一步呼吁worker.postMessage()将排队并且不被工作人员处理”,那么不,你不能使用setTimeout()为了这。setTimeout()不是繁忙等待,而是一种线程内机制,用于将工作延迟到稍后的计划时间。网络工作者仍然会收到一个新的onmessage事件一发布就从主队列中删除。

但是,您可以做的是手动将它们排队并使用 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);
}
  • 每次收到消息时,工作人员都会将其放入队列中并调用tryToProcess.
  • tryToProcess只要数据库可用,就一次从队列中提取一条消息。
  • 如果数据库不可用并且有剩余消息,它将在 1 秒后重试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自网络工作者的 setTimeout 的相关文章

随机推荐