我想用不同的值执行相同的未来函数。订单并不重要。但我想在上述功能之后执行一些功能。我的想法是
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
如何在飞镖中实施..请帮助。
答案 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示例中也进行了更改,以更好地可视化异步代码的工作方式。