我无法回答为什么,因为我不是编写 javascript 标准的人。但是没有任何迹象表明工人是否已经终止。
检测终止
如果您需要检测这种状态,您必须创建自己的 API。我建议以这个简单的基于函数的草稿为起点:
//Override worker methods to detect termination
function makeWorkerSmart(workerURL) {
// make normal worker
var worker = new Worker(workerURL);
// assume that it's running from the start
worker.terminated = false;
// allows the worker to terminate itself
worker.addEventListener("message", function(e) {
if(e.data == "SECRET_WORKER_TERMINATE_MESSAGE") {
this.terminated = true;
console.info("Worker killed itself.");
}
});
// Throws error if terminated is true
worker.postMessage = function() {
if(this.terminated)
throw new Error("Tried to use postMessage on worker that is terminated.");
// normal post message
return Worker.prototype.postMessage.apply(this, arguments);
}
// sets terminate to true
// throws error if called multiple times
worker.terminate = function() {
if(this.terminated)
throw new Error("Tried to terminate terminated worker.");
this.terminated = true;
// normal terminate
return Worker.prototype.terminate.apply(this, arguments);
}
// creates NEW WORKER with the same URL as itself
worker.restart = function() {
return makeWorkerSmart(workerURL);
}
return worker;
}
要同时检测工作人员的终止,您需要在每个工作人员内部运行此代码:
function makeInsideWorkerSmart(workerScope) {
var oldClose = workerScope.close;
workerScope.close = function() {
postMessage("SECRET_WORKER_TERMINATE_MESSAGE");
oldClose();
}
}
makeInsideWorkerSmart(self);
当worker以close终止自己时,这将向主窗口发送消息。
你可以这样使用它:
var worker = makeWorkerSmart(url);
worker.terminate();
worker.postMessage("test"); // throws error!
重启worker
在重新启动工作器时:从技术上讲,如果不自己将其保存在某个位置,就不可能从以前的状态开始。我提出了我在上面实施的这个解决方案:
worker.terminate();
worker = worker.restart();
您也可以通过这种方式克隆工作人员,因为它不会停止原始工作人员。