我正在尝试与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版本时,没有任何内容写入控制台。在编译时或运行时都没有错误。它只是默默地失败。
非常感谢任何帮助。我可能错过了一些愚蠢的东西,但是我一直坚持这个时间超过我承认... ...
答案 0 :(得分:2)
由于工人是SharedWorker
,你应该调用方法:
myWorker.port.start();
在附加onMessage
侦听器后,(documentation at MDN):
如果使用addEventListener附加onmessage事件,则使用其start()方法手动启动端口
此外,在侦听器中,参数msg
是MessageEvent
,可以通过访问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测试