我有以下代码:
src/store/modules/outcome-analyzer/outcome-analyzer.js
import Worker from 'worker-loader!./set-hit-percentages.worker.js';
// ...
let actions = {
setHitPercentages: function (context) {
let worker = new Worker();
// let players = resultsMutations.constructPlayersForSetHitPercentages(context.state);
// worker.postMessage({
// message: 'get hit percentages',
// players: players,
// });
worker.postMessage({
message: 'test',
value: 'foobar',
});
worker.onmessage = function (e) {
if (e.data.message === 'finished') {
context.commit('outcomeAnalyzer/setHitPercentages', e.data.hitPercentages);
}
};
worker.terminate();
},
};
src/store/modules/outcome-analyzer/set-hit-percentages.worker.js
self.addEventListener('message', function (e) {
debugger;
if (e.data.message === 'test') {
console.log(e.data.value);
}
else if (e.data.message === 'get hit percentages') {}
});
当 setHitPercentages
被调用时,它应该向工作人员发送一条消息,并且工作人员应该接收它。 worker 永远不会收到它。 set-hit-percentages.worker.js
中的 debugger
永远不会被命中,console.log
也不会被命中。
- 在
setHitPercentages
调试器中,我看到定义了Worker
。我还看到worker
是在let worker = new Worker();
运行之后定义的。worker
有onmessasge
和onerror
方法,它继承了其他东西,比如postMessage
。 - 我有
worker-loader
在我的node_modules
中。在package.json
我有"worker-loader": "^1.1.1"
。 - 我在代码的另一部分使用了一个 worker,它工作正常。有效的代码似乎与我在此处发布的无效代码完全相似,包括
import Worker from 'worker-loader!./xxx-yyy-zzz.worker.js';
部分。 - 我正在使用 Chrome。我也尝试过 Safari,但它在那里也不起作用。
- 当我重现问题时,我没有启动其他工作人员,而是启动了 this answer说多个 worker 不应该引起问题。 (我也试过启动另一个 worker ,终止它,然后运行有问题的代码,在那种情况下问题仍然存在。当我注释掉另一个 worker 的代码时,我也继续有问题。)
- 这是一个以 vue-webpack-boilerplate 开头的 Vue 应用程序.
最佳答案
您放错了 worker.terminate();
,您可能希望在您的 onmessage
处理程序中使用它。就像现在一样, worker 正在生成,但几乎立即被杀死。
关于javascript - 内联加载的 Web Worker 与 worker-loader 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51333437/