【发布时间】:2021-06-08 04:22:51
【问题描述】:
这是使用 Future 的代码
void main(List<String> arguments) {
testFuture();
print('main');
}
Future testFuture() {
return Future(() {
for (var i = 0; i < 1000000000; i++) {}
print('futureDone');
});
}
输出如下
main
futureDone
当我想使用 async 来简化我的代码时,代码如下所示
Future testFuture() async{
for (var i = 0; i < 1000000000; i++) {}
print('futureDone');
}
输出如下
futureDone
main
一开始我很迷茫,不知道为什么他们的输出不一样,找了很多资料,直到在https://dart.dev/codelabs/async-await#execution-flow-with-async-and-await看到这些字。
async 函数同步运行,直到第一个 await 关键字。这意味着在异步函数体内,第一个 await 关键字之前的所有同步代码都会立即执行。
我不知道为什么,所以考虑到这一点,如果我想使用异步,我需要编写这样的代码。
Future testFuture() async{
await Future.delayed(Duration(seconds: 0));
for (var i = 0; i < 1000000000; i++) {}
print('futureDone');
}
输出如下
main
futureDone
通过阅读旧版Dart中的StackFlow problem,发现旧版没有 “一个 async 函数会同步运行,直到第一个 await 关键字。这意味着在一个 async 函数体内,第一个 await 关键字之前的所有同步代码都会立即执行。”,DART 为什么会做出这样的改变?还是我的使用方式有问题?
【问题讨论】:
-
更改上下文总是要付出代价的。您希望尽可能多地执行而不是仅仅将事件放在我们将立即执行的事件队列中,这是有道理的。例如。
async方法中的第一个代码很可能会调用一些我们想要等待结果的代码。也许,有可能我们并不总是以await结束某事(例如,如果我们实现某种缓存)。
标签: dart async-await