与Dart中的共享工作人员进行通信

时间:2016-10-12 19:52:08

标签: dart

我正在尝试与Dart的共享工作人员沟通,但我没有取得任何成功,我已经尝试了所有我能想到的。

作为一项测试,我只是想让一个基本的工作人员只需回应它发送的任何工作。

从HTML开始:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="scaffolded-by" content="https://github.com/google/stagehand">
    <title>wtf</title>
    <link rel="stylesheet" href="styles.css">
    <script defer src="main.dart" type="application/dart"></script>
    <script defer src="packages/browser/dart.js"></script>

    <!-- <script defer src="test.js"></script> -->
</head>

<body>

  <div id="output"></div>

</body>
</html>

JavaScript worker(worker.js):

onconnect = function(e) {
    var port = e.ports[0];

    port.onmessage = function(e) {
        port.postMessage("Worker received message: " + e.data);
    }
}

Dart代码(main.dart):

import 'dart:html';
import 'dart:async';

void main() async {
  var myWorker = new SharedWorker("worker.js");

  myWorker.port.onMessage.listen((msg) {
        print("Worker says: " + msg);
      });

  new Timer.periodic(const Duration(seconds: 1), (timer) {
        myWorker.port.postMessage("Hello, world");
      });
}

编写器确实每秒调用一次,我已经验证共享工作程序是否运行(使用chrome:// inspect)。

为了缩小问题范围,我将Dart代码的JavaScript版本(在test.js中)放在一起,它按预期工作。如果您注释掉main()的内容并将HTML中的引用取消注释到test.js就可以了。 test.js的内容:

var myWorker = new SharedWorker("worker.js");

myWorker.port.onmessage = function(e) {
    console.log("Worker says: " + e.data);
}

setInterval(function() {
    myWorker.port.postMessage("Hello, world");
}, 1000);

但是,使用Dart版本时,没有任何内容写入控制台。在编译时或运行时都没有错误。它只是默默地失败。

非常感谢任何帮助。我可能错过了一些愚蠢的东西,但是我一直坚持这个时间超过我承认... ...

1 个答案:

答案 0 :(得分:2)

由于工人是SharedWorker,你应该调用方法:

myWorker.port.start();

在附加onMessage侦听器后,(documentation at MDN):

  

如果使用addEventListener附加onmessage事件,则使用其start()方法手动启动端口


此外,在侦听器中,参数msgMessageEvent,可以通过访问data属性(与JS代码相同)来检索文本:

print("Worker says: " + msg.data);

按照整个代码进行更改:

import 'dart:html';
import 'dart:async';

void main() async {
  var myWorker = new SharedWorker("worker.js");

  myWorker.port.onMessage.listen((msg) {
        print("Worker says: " + msg.data);
  });
  myWorker.port.start(); 

  new Timer.periodic(const Duration(seconds: 1), (timer) {
        myWorker.port.postMessage("Hello, world");
  });
}

使用Dart 1.19.1测试