Async/await in List.forEach()

2019-06-16 21:29发布

I'm writting some kind of bot (command line application) and I'm having trouble with async execution when I'm using "forEach" method. Here is a simplified code of what I'm trying to do :

main() async {
  print("main start");
  await asyncOne();
  print("main end");
}

asyncOne() async {
  print("asyncOne start");
  [1, 2, 3].forEach(await (num) async {
    await asyncTwo(num);
  });
  print("asyncOne end");
}

asyncTwo(num) async
{
  print("asyncTwo #${num}");
}

And here is the output :

main start
asyncOne start
asyncOne end
main end
asyncTwo #1
asyncTwo #2
asyncTwo #3

What I'm trying to get is :

main start
asyncOne start
asyncTwo #1
asyncTwo #2
asyncTwo #3
asyncOne end
main end

If someone know what I'm doing wrong I would appreciate it.

3条回答
够拽才男人
2楼-- · 2019-06-16 21:51

You can't use forEach for this because it doesn't actually look at the return values of its callbacks. If they are futures, they will just be lost and not awaited.

You can either do a loop like Steven Upton suggested, or you can use Future.wait if you want the operations to run simultaneously, not one after the other:

asyncOne() async {
  print("asyncOne start");
  await Future.wait([1, 2, 3].map(asyncTwo));
  print("asyncOne end");
}
查看更多
叛逆
3楼-- · 2019-06-16 21:56

You need to use Future.forEach.

main() async {
  print("main start");
  await asyncOne();
  print("main end");
}

asyncOne() async {
  print("asyncOne start");
  await Future.forEach([1, 2, 3], (num) async {
    await asyncTwo(num);
  });
  print("asyncOne end");
}

asyncTwo(num) async
{
  print("asyncTwo #${num}");
}
查看更多
仙女界的扛把子
4楼-- · 2019-06-16 22:08

I don't think it's possible to achieve what you want with the forEach method. However it will work with a for loop. Example;

asyncOne() async {
  print("asyncOne start");
  for (num number in [1, 2, 3])
    await asyncTwo(number);
  print("asyncOne end");
}
查看更多
登录 后发表回答