workerMain<S, T> function
用于worker, web真异步需要单独的js文件入口,该js可以是dart编译生成的,
也就是说必须一个包含main方法的dart代码, 此处封装目的就是简化该dart入口代码,只要一行代码传入需要的Stream转化方法,
emptyTransformer要替换成自己实际需要的方法,
main() {
workerMain(emptyTransformer);
}
Implementation
workerMain<S, T>(Stream<T> Function(Stream<S> e) mapper) {
final Stream<T> stream;
try {
stream = mapper(callbackToStream('onmessage'));
} catch (e, s) {
// 针对mapper本身不是async方法,同步执行时抛异常的情况,
if (e is Error || e is Exception) {
// 异常传到主线程再抛出,
jsSendMessage(IsolateException(e, s).toJson());
return;
}
rethrow;
}
stream.listen(
(message) async {
jsSendMessage(message);
},
onError: (e, s) {
if (e is Error || e is Exception) {
jsSendMessage(IsolateException(e, s).toJson());
}
},
onDone: () {
jsSendMessage(const IsolateStreamDone().toJson());
},
);
}