循环中的未来函数无法正常工作

时间:2015-07-03 19:58:08

标签: dart

我想用不同的值执行相同的未来函数。订单并不重要。但我想在上述功能之后执行一些功能。我的想法是

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

如何在飞镖中实施..请帮助。

2 个答案:

答案 0 :(得分:0)

forEach不能以这种方式使用。请改用await for(封闭函数必须为async

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

答案 1 :(得分:0)

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

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

当您编写<some future>.then( (){...} );之类的结构时,您不会立即运行.then( )中定义的代码。您只需定义一个回调,稍后再调用。因此,在您的代码中,您已经定义了3个回调,然后立即打印并且#34;全部完成&#34;,当您的期货甚至没有开始工作时。此时他们只是坐在飞镖的事件循环中,等待有机会被执行。只有当你完成当前代码的执行时,他们才会获得这个机会,而不是更早,因为Isolate是作为单个线程运行的。

我使用Future.wait()等待多个期货,因为您说订单并不重要。这比一个一个地等待期货更有效率。但是如果顺序很重要,你必须使用Future.forEach(),它将不会在第一个完成之前开始执行第二个Future。

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