【问题标题】:How to Async/await in List.forEach() in Dart如何在 Dart 的 List.forEach() 中异步/等待
【发布时间】:2017-07-16 23:58:09
【问题描述】:

我正在编写某种机器人(命令行应用程序),并且在使用“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

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

【问题讨论】:

  • 异步调用不适用于<List>.forEach(),您需要使用传统循环。为什么? This article 解释得很好。我刚刚发现 Dart 和 Node.JS 几乎是一样的。

标签: flutter dart asynchronous foreach


【解决方案1】:

你需要使用 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}");
}

【讨论】:

  • 这应该是认可的答案。
  • 对于任何阅读本文的人,请注意,不幸的是,这仅适用于可迭代对象。
  • 是的,由于应用程序的互联网连接问题,这非常适合我的需要。它会加载列表并添加它,当它完成时,通知。
  • 您为我节省了数小时的调试和互联网搜索时间。
  • 完美答案!
【解决方案2】:

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

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

【讨论】:

  • 这就是我开始的想法。感谢您确认。我认为“等待”表达在它周围的任何东西之前,但是哦,好吧......
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 这实际上是@Stephane 上面发布的内容的一个子集。
    猜你喜欢
    • 2017-12-11
    • 2020-01-14
    • 2019-12-10
    • 2021-10-04
    • 2017-12-07
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多