【发布时间】:2018-07-13 22:13:47
【问题描述】:
我有以下代码:
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发送一条消息,并且worker应该接收它。工人永远不会收到它。 set-hit-percentages.worker.js 中的 debugger 永远不会被命中,console.log 也不会被命中。
- 在
setHitPercentages调试器中,我看到Worker已定义。我还看到worker是在let worker = new Worker();运行之后定义的。worker具有onmessasge和onerror方法,并且它继承了postMessage等其他内容。 - 我的
node_modules中有worker-loader。在package.json我有"worker-loader": "^1.1.1"。 - 我在我的代码的另一部分使用了一个worker,它可以工作。有效的代码似乎与我在此处发布的无效代码完全相似,包括
import Worker from 'worker-loader!./xxx-yyy-zzz.worker.js';部分。 - 我正在使用 Chrome。我也尝试了 Safari,但它也无法在那里工作。
- 当我重现问题时,我不会启动其他工作人员,但this answer 表示多个工作人员不应该引起问题。 (我也尝试过启动另一个worker,终止它,然后运行有问题的代码,在那种情况下问题仍然存在。当我注释掉另一个worker的代码时,我也继续有问题。)
- 这是一个 Vue 应用,以 vue-webpack-boilerplate 开头。
【问题讨论】:
-
如果你替换确实工作的工人会发生什么?那么它会加载吗?此外,在 Chrome JS 调试器中,如果您在主线程中遇到断点,您应该能够看到列出的工作进程。值得检查一下工人是否真的产生了。
-
旧帖,但可能有帮助:blog.chromium.org/2012/04/…
-
@Jacob 我确实没有看到工作进程在调试器中生成,而我确实看到它在其他代码中生成。
-
@Jacob 有趣的是,当我替换工作的工人时,它不再工作了。 (该工作人员中的调试器不再被击中;并且我不再在开发工具中看到该工作人员产生。)
-
愚蠢的问题,但只是最后的
worker.terminate()行是你的问题吗?看起来你要立即杀死它。
标签: javascript webpack vue.js web-worker