循环中的未来功能不起作用

Future functions in a loop not working

我想用不同的值执行相同的未来功能。顺序并不重要。但是我想在上面的未来功能之后执行一些功能。我的想法是

addrMapList.forEach((addrMap){ //length is 3
    exeQuery(sql).then((result){
      print(result);
    });
});
print('All finished');
// other actions

Future exeQuery(String sql){
    var c=new Completer();
    Random rnd=new Random();
    c.complete(rnd.nextInt(100));
    return c.future;
}

But the result is

All finished
72
90
74


But I need a result like

72
90
74
All finished

如何在dart中实现..请帮助。

forEach 不能这样使用。使用 await for 代替(封闭函数需要 async

Future someFunc() async {
  await for (var addrMap in addrMapList) {
    var result = await exeQuery(sql);
    print(result);
  } 
  // other action 
} 

Here 是您的示例的修改版本,可以按预期工作。

首先,您应该了解异步代码的工作原理,以及为什么它不适合您的情况:

当您编写像 <some future>.then( (){...} ); 这样的结构时,您不会立即 运行 在 .then( ) 中定义代码。您只需定义一个回调,稍后调用。因此,在您的代码中,您定义了 3 个回调,然后立即打印 "All finished",当时您的期货甚至都没有开始工作。此时他们只是坐在 dart 的事件循环中等待执行的机会。只有当您完成当前代码的执行时,他们才会有机会,而不是更早,因为 Isolate 是 运行 作为单个线程。

我用Future.wait()等待多个期货因为你说顺序不重要。这比一个一个地等待 Futures 更有效率。但是如果顺序很重要,你必须使用 Future.forEach(),直到第一个 Future 完成后才会开始执行第二个 Future。

代码中还有一件事是返回 Future 的函数实际上是同步的,因为它总是 returns 已经完成了 Future。这也在上面的 dartpad 示例中进行了更改,以更好地可视化异步代码的工作方式。