我需要同时运行许多异步函数并在完成时生成结果,顺序并不重要。
这是我在一个简化的示例中的内容,当然这不能正常工作,因为它在移动到下一个请求之前等待每个响应。
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/