请参阅此示例:
// CLOSEWORKER.JS:
self.postMessage('foo');
self.close();
self.postMessage('bar');
setTimeout(() => self.postMessage('baz'), 0);
// MAIN.JS:
const worker = new Worker('./worker.js');
worker.onmessage = ({data}) => console.log(data);
即使我调用了 self.close()
,下一行 self.postMessage('bar');
仍然执行并记录 'bar'。我可以不明白,因为 close 方法应该在被调用后立即终止工作线程。
此外,请参阅另一个示例:
TERMINATEWORKER.JS:
self.onmessage = ({data}) => console.log(data);
MAIN.JS:
const worker = new Worker('./worker.js');
setTimeout(() => {
worker.postMessage('foo');
worker.terminate();
worker.postMessage('bar');
setTimeout(() => worker.postMessage('baz'), 0);
}, 1000)
当使用terminate
方法而不是close
方法时,代码按照我的预期执行。它只记录“foo”,不记录任何其他内容,这表明线程在调用 terminate
方法后立即被终止。
最佳答案
WorkerGlobalScope.close()
调用时会丢弃已计划的所有任务并设置 closing
WorkerGlobalScope 的标志,有效防止任何新任务排队。
但是,它不会停止当前任务的执行。
事实上,在您的第一个示例中,它将运行当前脚本直到结束,并仍然执行 self.postMessage('bar')
操作,您的主线程将能够处理.
Worker.terminate()
另一方面也会“中断当前在工作线程中运行的脚本。”
关于javascript - self.close 真的会杀死网络工作线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67564331/