【问题标题】:Web Worker loaded inline with worker-loader not working内联加载的 Web Worker 与 worker-loader 不工作
【发布时间】: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


【解决方案1】:

你放错了你的worker.terminate();,你可能想要在你的onmessage处理程序中。就像现在一样,工人正在生成,但之后几乎立即被杀死。

【讨论】:

    猜你喜欢
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2018-10-17
    相关资源
    最近更新 更多