我知道我的大脑在async/await上并不完全清楚所以我需要一些清晰度.我看到很多例子在某些行上使用了await而在标记为异步的函数中没有使用其他行.例如,我很少见过像这样的例子(我使用print语句作为简单/基本的例子.):
myFunction() async {
await functionA();
await print("This really long thing that's going to print out.");
await functionB();
await MyExtraClass.lookupSomethingQuickly();
...
}
Run Code Online (Sandbox Code Playgroud)
所以我看到它的例子通常是这样的:
myFunction() async {
await functionA();
print("This really long thing that's going to print out.");
await functionB();
MyExtraClass.lookupSomethingQuickly();
...
}
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否只是假设简单的事情会按顺序完成,或者理论上,等待在每一行的前面是我应该做的事情,我绝对需要第1行跟随第2行跟随第3行,等...如果我绝对需要在functionB()关闭之前完成打印?
基本上我发现自己每次使用async/await编写一个函数时都会在每一行上进行判断调用,而且我从来不知道我的代码是否正常工作,因为时机和运气都很好,或者是否会出现会导致执行失败的情况.
async/ await是使asynchronuos代码更容易编写,阅读和推理.Synchronuos代码不需要这样的支持.
有关Dart中的异步编程,请参阅https://www.dartlang.org/docs/tutorials/futures/
如果你采用这个代码示例
import 'dart:async' show Future;
void main() {
doSomethingAsync().then((_) => print('afterwards'));
print('at last');
}
Future doSomethingAsync() {
return new Future.delayed(const Duration(seconds: 1), () {
print('done something');
});
}
Run Code Online (Sandbox Code Playgroud)
在DartPad中尝试一下
打印
最后
做了一件
事后
如果您不熟悉异步执行,这可能会令人惊讶
这是因为传递给的代码以Future.delayed()1秒的延迟执行.执行代码时Future,doSomethingAsync()"完成" 返回的实例Future.delayed().
在这一行
doSomethingAsync().then((_) => print('afterwards'));
Run Code Online (Sandbox Code Playgroud)
我们呼吁.then(...)在Future返回的doSomethingAsync(),并通过封闭(内嵌功能).then(...).((_) => print('afterwards')).
一个特点Future是它调用then(...)完成后传递给的代码(在我们的情况下,done something在1秒延迟后打印).
所以执行就像是
doSomethingAsync()调度print('done something)以便以后执行并返回aFuture print('at last');打印的电话at last print('done something')呼叫1秒延迟后Future从返回doSomethingAsync()完成Future呼叫`(_)=>打印( '事后')main() 结束. 当我们使用async/ await代码看起来像
import 'dart:async' show Future;
Future main() async {
await doSomethingAsync();
print('afterwards');
print('at last');
}
Future doSomethingAsync() {
return new Future.delayed(const Duration(seconds: 1), () {
print('done something');
});
}
Run Code Online (Sandbox Code Playgroud)
在DartPad中尝试一下
运行时,输出为
做了一件
事后
在最后
我们也可以使用async/ awaitin,doSomethingAsync()但现在我们只专注于main()
现在执行看起来像
doSomething()并等待返回Future完成print('done something')执行Future完毕await继续执行代码print('afterwards');print('at last');这可能是您期望的行为.
对你原来的问题.await仅在调用返回a时才需要,Future并且您希望以下代码仅在Future完成时执行.如果呼叫没有返回Future,则没有什么可以等待的.
await print('xxx')仍然是有效的代码.这是为了支持有时会执行某些异步工作并返回a的函数,Future但有时候没有异步工作要做,并立即执行代码,然后返回.在这种情况下,没有什么可以等待的.
someTimesAsync() {
if(new DateTime.now().weekday == 1) {
return new Future.delayed(const Duration(seconds: 1), () {
print('done something');
});
} else {
print('done something');
}
}
Run Code Online (Sandbox Code Playgroud)
await someTimesAsync();
Run Code Online (Sandbox Code Playgroud)
适用于这两种情况.如果不这样做会很麻烦.
为更多细节async/ await又见https://www.dartlang.org/articles/await-async/
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |