workerMain<S, T> function

dynamic workerMain<S, T>(
  1. Stream<T> mapper(
    1. Stream<S> e
    )
)

用于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());
    },
  );
}