组合飞镖期货流

问题描述 投票:0回答:1

将多个流与流转换器和返回未来的异步函数结合在一起,我最终得到了未来的流。

[我可以使用类似的方法来展平Future的流:

Stream<T> flattenStreamsOfFutures<T>(Stream<Future<T>> source) async* {
  await for (var future in source) yield* Stream.fromFuture(future);
}

对我来说,将未来转换为小溪有点过大的杀伤力,但我没有遇到任何优雅的解决方案。我当然可以将它传递给另一个可以通过听众观察到的声音,但是我怀疑我只是忽略了一种更简单的方法?

dart async-await stream rxdart
1个回答
0
投票

您的方法有一个问题,即在所有期货均完成之前,返回的流将不会返回任何内容。

不过,还有一种更惯用的方法来从一系列期货中创建数据流:Stream.fromFutures

Stream.fromFutures([
  Future.delayed(Duration(seconds: 3), () => 'a'),
  Future.delayed(Duration(seconds: 2), () => 'b'),
  Future.delayed(Duration(milliseconds: 1500), () => 'c'),
]).listen(print);

如果输入必须是期货的[[stream]]而不是列表,那么香草Dart中没有简单的方法可以做到这一点。这种方法至少应使其表现出预期的效果。Stream<T> flattenFutures<T>(Stream<Future<T>> source) { final controller = StreamController<T>(); source.listen((future) => future.then((value) => controller.add(value))); return controller.stream; }

© www.soinside.com 2019 - 2024. All rights reserved.