循环中的未来功能不起作用
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 示例中进行了更改,以更好地可视化异步代码的工作方式。
我想用不同的值执行相同的未来功能。顺序并不重要。但是我想在上面的未来功能之后执行一些功能。我的想法是
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 示例中进行了更改,以更好地可视化异步代码的工作方式。