Dart:在用dart编写的浏览器webworker中用于dart2js

时间:2015-02-11 19:11:54

标签: dart web-worker

基本上我现在很困惑:设置非常简单 - 我想使用dart编写主应用程序和Web worker部分 - 需要访问常规JS Web worker具有的相同API的部分作为一个真正的工作者部署(即编译为js)。

据我所知,dart isolates不是我想要的,因为当编译成JS时,那些执行作为主线程的一部分,即使它们不与主代码共享状态 - 这对我的用例是不可接受的。 / p>

另外,如果我理解正确的话,如果我要使用带有脚本uri的Worker API,我就不能使用dart代码,但即使我可以将它作为一个完全独立的项目而且不能成为我的主代码的一部分(就像它是与分离株)。

目前的Dart状态,我的情景是否可行?关于如何从dart使用web worker并在dart中编写worker代码并且可以访问xmlhttprequest的简单示例将是很好的。我知道我可能无法在没有序列化/反序列化的情况下传输对象,但这没关系。

感谢。

2 个答案:

答案 0 :(得分:2)

dart2js中的隔离区将映射到worker。你应该可以使用spawn或spawnUri。那部分应该没问题。

目前,您更有可能在Dartium中遇到问题,而隔离区不会映射到工作人员。它们并行运行,但无法访问工作程序API。正在进行中。这也是你不能在Dartium中使用spawn的原因,以防止使用dart:html代码产生某些东西,如果它试图使用这些API会破坏。不幸的是,即使是像print()这样简单的事情,也会立即投入Dartium孤立。但据我所知,这一切在部署中都很有效。

答案 1 :(得分: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/文件夹中。它们共享相同的自定义dog文件包,该文件包位于lib/文件夹中。

现在,主要警告:在开发过程中要使用Web Worker在浏览器中正确运行此Web应用程序,而不是常见的webdev serve,我们需要使用webdev serve -r。表示发行版本,换句话说,使用dart2js而不是dartdevc。

如果您想查看整个工作示例,则为git repro:https://github.com/yuan-kuan/dog-raiser