Future 的整数值之和

Sum of integer values of a Future

我正在尝试解析 HTML 文档,获取所有图像源,然后将所有图片的大小相加。 解析文档工作正常,获取图像源和获取它们的大小也是如此。

main(){
  print("Please input an URL");
  var url = stdin.readLineSync();

  getImageUrls(url).then((list) {
    list.forEach((imageUrl) {
      getImageSize(imageUrl).then((r) {
        print("$imageUrl, Size: $r bytes");
      });
    });
  });
}

Future<int> getImageSize(String url){
  final completer = new Completer();
  new StreamController()..stream.listen((str) => completer.complete(imageSize(str)))..add(url);
  return completer.future;
}

imageSize(String url){
  return http.get(url).then((response) => response.bodyBytes.length);
}

我正在努力将每张图片的大小加在一起成为一个整数。 我想我可以做这样的事情

main(){
  int total = 0;
  print("Please input an URL");
  var url = stdin.readLineSync();

  getImageUrls(url).then((list) {
    list.forEach((imageUrl) {
      getImageSize(imageUrl).then((r) {
        print("$imageUrl, Size: $r bytes");
        total += r;
      });
    });
  });
  print(total);
}

但是我需要等待 getImageUrls 完成才能打印我的总数。

谁能把我推向正确的方向?我觉得我错过了一些非常明显的东西。

最简单的方法是使用 "new" async/await

main() async {
  int total = 0;
  print("Please input an URL");
  var url = stdin.readLineSync();

  var list = await getImageUrls('url');
  for(int i = 0; i < list.length; i++) {
    var imageUrl = list[i];
    var r = await getImageSize(imageUrl);
    print("$imageUrl, Size: $r bytes");
    total += r;
  }
  print(total);
}

或评论中提到的Future.wait

main(){
  int total = 0;
  print("Please input an URL");
  var url = stdin.readLineSync();

  getImageUrls(url).then((list) {
    return Future.wait(list.map((r) {
      return getImageSize(imageUrl).then((r) {
        print("$imageUrl, Size: $r bytes");
        total += r;
      });
    });
  }).then((_) => print(total));
}