dart - 无需等待即可从异步函数的生成器中生成值

标签 dart stream generator dart-async

我需要同时运行许多异步函数并在完成时生成结果,顺序并不重要。

这是我在一个简化的示例中的内容,当然这不能正常工作,因为它在移动到下一个请求之前等待每个响应。

 Stream<String> stringGenerator(List<http.Request> requests) async* {
    final httpClient = http.Client();
    for (var req in requests) {
      final response = await httpClient.send(req);
      yield response.headers['example'];
    }
  }

最佳答案

您可以尝试看看这是否适合您?

Stream<String> stringGenerator(List<http.Request> requests) {
  final controller = StreamController<String>();
  final httpClient = http.Client();

  Future.wait(requests.map((req) => httpClient
          .send(req)
          .then((response) => controller.add(response.headers['example']!))))
      .whenComplete(() => controller.close());

  return controller.stream;
}

更正确的做法是这样,因为我们不想在根据 StreamController 的文档监听事件之前生成事件。对于内部使用来说,这确实不是问题,因为 StreamController 会缓冲事件,直到订阅监听器为止:

Stream<String> stringGenerator(List<http.Request> requests) {
  final controller = StreamController<String>();
  
  controller.onListen = () {
    final httpClient = http.Client();

    Future.wait(requests.map((req) => httpClient
        .send(req)
        .then((response) => controller.add(response.headers['example']!))))
        .whenComplete(() => controller.close());
  };

  return controller.stream;
}

关于dart - 无需等待即可从异步函数的生成器中生成值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66516065/

相关文章:

api - data!= null:必须将非null字符串提供给Text小部件

dart - 元素点击后如何关闭脚手架的抽屉?

c# - 流是什么意思?它的特点是什么?

c# - 使用 iTextSharp 将文本添加到内存流中的现有多页 PDF 文档

python - 类内的 Nose 测试生成器

testing - Mockito:无法向流中添加数据;当我调用流接收器函数时,它会在 null 上抛出函数调用

c# - WebRequest GetResponseStream 读取字节

c# - c#代码的控制流图生成器

python 在函数中使用yield from

json - 如何在flutter中将嵌套模型对象传递给父对象