3

在我的网络应用程序中,我经常需要重新实例化 Worker 对象,因为无法将新脚本传递给旧的现有对象。一段时间后,一些浏览器开始阻止创建新的 Worker 对象,因为它们达到了一个窗口的 Worker 限制。我试图在创建新对象之前删除已完成的工作对象,但显然我做错了。这是一个简单的测试,在 opera 中失败(限制为每个窗口 256 个工作人员):

var worker;    
for(var i = 0; i < 300; i++) {
  for (var key in worker) worker[key] = null;
  delete worker.onmessage;
  delete worker.onerror;
  delete worker;
  worker = new Worker("script.js");
}

我的问题是如何完全删除一个工作对象,以便永远不会达到浏览器限制?谢谢!

4

2 回答 2

4

不确定这是否适用于网络工作者。您是否在窗口上创建对象?如果是这样,你可以试试这个:

delete window.worker

也许调用终止然后删除它?

window.worker.terminate();
delete window.worker;

文档指出它会停止一切,但在调用 terminate() 时不会清理。

于 2013-07-05T14:21:54.433 回答
3

您需要终止工作人员,而不是删除对象。删除对象所做的只是删除指向工作人员的指针。以我的经验,有太多 OPEN 工人是一个问题,会阻止你的程序工作,但是对于已经被 self.close() 关闭的工人没有限制;在 worker 或 worker.terminate() 中;在主脚本中。如果您正确关闭工作人员,则永远不必使用删除工作人员。

于 2013-07-22T14:07:59.497 回答