【问题标题】:are messages sent via worker.postMessage() queued?通过 worker.postMessage() 发送的消息是否排队?
【发布时间】:2015-12-22 05:49:28
【问题描述】:

创建一个worker后,我可以通过postMessage向它发送消息。例如:

var worker = new Worker('helper.js');
worker.postMessage({...});

在 helper.js 中,worker 需要使用onmessage = function (event) { ... }; 添加一个监听器

我的问题是,如果在工作脚本仍在加载时向工作人员发送了一条或多条消息,是否可以保证消息最终排队并传递,或者它们可能会丢失?

【问题讨论】:

    标签: web-worker


    【解决方案1】:

    http://www.w3.org/TR/2015/WD-workers-20150924/#communicating-with-a-dedicated-worker 的规范说

    专用工作人员使用的隐式 MessagePort 在创建时隐式启用其端口消息队列

    还有

    • https://developer.mozilla.org/en/docs/Web/API/Worker/postMessage 没有提到在发送消息之前必须等待工作程序加载

    • 在创建一个不能在缓存中的工作人员后立即测试发布消息http://plnkr.co/edit/jM1qy9lDEFKYhR0TDsKa?p=preview

      var worker = new Worker('worker.js?' + (new Date()).getTime());
      worker.postMessage('');
      worker.postMessage('');
      

      工人只是输出到控制台

      self.onmessage = function() {
        console.log('received');
      }
      

      在测试时总是为我显示 2 条控制台消息。虽然这并不能保证它会一直以这种方式工作,但鉴于我试图让它丢失消息并失败,这是合理的证据。

    【讨论】:

    • 最新版本的规范说“专用工作人员使用的隐式MessagePort在创建时隐式启用其端口消息队列,因此没有等效于MessagePort接口的start()方法工作人员界面”。这意味着“隐式 MessagePort ... 隐式启用其端口消息队列”的真正含义是在 MessagePort 上调用了start(),它“开始发送在端口上排队的消息”。这可以解释为什么在 tobek 的答案的示例中消息会丢失。
    【解决方案2】:

    在浏览器下载和解析工作脚本时消息将排队,但 onmessage 必须在工作脚本中同步定义(至少在 Chrome v56 中)。

    以下将完全工作:

    worker.js:

    setTimeout(function() {
      onmessage = function() {
        console.log('received message');
      }
    }, 0);
    

    main-script.js:

    var worker = new Worker('worker.js');
    worker.postMessage('first message'); // this won't go through
    setTimeout(function() {
      worker.postMessage('second message'); // this will
    }, 1000);
    

    worker 的 onmessage 函数只会在第二条消息时触发。

    我已经在这个 plunkr 中演示了这个问题:http://embed.plnkr.co/G54gk9Cz6XhZ3E6ZB3Nf/

    importScripts 确实在脚本下载之前停止在 worker 中执行,所以等到之后再定义 onmessage 应该没问题。

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 2012-10-20
      • 2017-04-27
      • 2014-11-01
      • 1970-01-01
      • 2013-04-02
      • 2023-04-10
      • 2015-11-17
      • 2014-03-29
      相关资源
      最近更新 更多