Dart:在Dart编写的浏览器WebWorker中,用于Dart2js。

3
基本上我现在非常困惑:设置非常简单-我想使用Dart编写主应用程序和Web工作程序部分-这部分需要访问与常规JS Web Worker相同的API,并且在部署时作为真正的工作者运行(即编译为js)。
据我所知,Dart隔离并不是我想要的,因为当编译为JS时,即使它们不与主代码共享状态,它们也作为主线程的一部分执行-对于我的用例而言不可接受。
此外,如果我理解正确,如果我要使用脚本uri使用Worker API,则无法使用Dart代码,但即使我可以,它也必须是完全独立的项目,不能成为我的主要代码的一部分(就像与隔离一样)。
在Dart的当前状态下,我的情况是否可能?在Dart中使用Web Worker并将Worker代码也用Dart编写,并具有访问XMLHttpRequest的简化示例将是很好的选择。我知道我可能无法传输对象而不进行序列化/反序列化,但没关系。
谢谢。
2个回答

3
在dart2js中,隔离将被映射到工作线程。您应该能够使用spawn或spawnUri。所以那部分应该没问题。
目前在Dartium中开发时更容易出现问题,因为隔离不会映射到工作线程。它们并行运行,但无法访问工作线程API。这正在得到解决。这也是您不能在Dartium中使用spawn的原因,以防止生成带有dart:html代码的内容,如果尝试使用这些API,则会破坏它。很不幸,即使像print()这样简单的东西现在也会在Dartium隔离中引发错误。但据我所知,在部署中所有都可以正常工作。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Peter StJ
1
是的。您需要使用发送/接收端口在它们之间传递数据,因此需要序列化。在Dartium工作器中运行JS可能会有问题,但这是我们正在解决的一部分。 - Alan Knight
这方面有更新吗?现在在dart 1.16中我们可以在Dartium中使用隔离器吗? - kzhdev

0

我成功地完成了这项工作,但有一个注意事项。

这是 main.dart 的样子

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

import 'package:excel_worker/dog.dart';

void main() {
  var w = Worker('worker/dog_raiser.dart.js');

  // Listen to Worker's postMessage().
  // dart.html convert the callback to a Stream.
  w.onMessage.listen((msg) {
    var dog = Dog(name: msg.data['name'], age: msg.data['age']);
    print('master took back ${dog.name} and she turns into ${dog.age}!');
  });

  // After one second, post a message to the Worker.
  new Timer(Duration(seconds:1), () {
    w.postMessage(Dog(name : 'Marley', age: 1));
  });
}

这是工人。

import 'package:js/js.dart';

import 'package:excel_worker/dog.dart';

@anonymous
@JS()
abstract class MessageEvent {
  external dynamic get data;
}

@JS('postMessage')
external void PostMessage(obj);

@JS('onmessage')
external void set onMessage(f);

void main() {
  print('Worker created');

  // 'allowInterop' is necessary to pass a function into js.
  onMessage = allowInterop((event) {
    var e = event as MessageEvent;
    var dog = e.data as Dog;
    print('worker: got ${dog.name} from master, raising it from ${dog.age}...');

    PostMessage(Dog(name : '${dog.name} 2.0', age: dog.age + 1));
  });
}

main.dartworker.dart都需要位于web/文件夹中。它们共享位于lib/文件夹中的同一个自定义狗包。

现在,最重要的是:为了在开发过程中正确地在浏览器中运行具有Web Worker的Web应用程序,我们需要使用webdev serve -r而不是常规的webdev serve。这表示一个发布版本,换句话说,使用dart2js而不是dartdevc。

如果您想要查看整个示例,请访问git repro:https://github.com/yuan-kuan/dog-raiser


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接