85

我正在编写某种机器人(命令行应用程序),并且在使用“forEach”方法时遇到了异步执行问题。这是我正在尝试做的简化代码:

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}");
}

这是输出:

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

我想要得到的是:

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

如果有人知道我做错了什么,我将不胜感激。

4

4 回答 4

242

您需要使用 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}");
}
于 2018-02-25T16:24:44.570 回答
72

我认为用这种forEach方法不可能实现你想要的。但是,它将与for循环一起使用。例子;

asyncOne() async {
  print("asyncOne start");
  for (num number in [1, 2, 3])
    await asyncTwo(number);
  print("asyncOne end");
}
于 2017-02-26T11:21:15.023 回答
17

您不能使用forEach它,因为它实际上并不查看其回调的返回值。如果它们是未来,它们将只是丢失而不是等待。

您可以像 Steven Upton 建议的那样执行循环,或者Future.wait如果您希望操作同时运行,而不是一个接一个地运行,则可以使用:

asyncOne() async {
  print("asyncOne start");
  await Future.wait([1, 2, 3].map(asyncTwo));
  print("asyncOne end");
}
于 2017-02-27T12:47:02.713 回答
11

我知道这是一个老问题,但我会在这里留下一个新的答案,希望这对未来的人有所帮助。

您可以通过执行以下操作将 forEach用于您想要实现的目标:

  asyncOne() async {
  print("asyncOne start");
  await Future.forEach([1, 2, 3],(num) async {
    await asyncTwo(num);
  });
  print("asyncOne end");
}
于 2019-10-13T07:32:27.160 回答