原文:https://www.dartlang.org/guides/language/language-tour#asynchrony-support
Dart库中包含许多返回Future或Stream对象的函数。这些函数是异步的:它们在设置可能耗时的操作(例如I / O)后返回,而不等待该操作完成。
async和await关键字支持异步编程,允许您编写看起来类似于同步代码的异步代码。
处理Future
当您需要完成Future的结果时,您有两个选择:
- Use
async
andawait
. - Use the Future API, as described in the library tour.
使用async和await的代码是异步的,但它看起来很像同步代码。 例如,这里有一些代码使用await来等待异步函数的结果:
await lookUpVersion();
要使用await,代码必须位于异步函数中 - 标记为async的函数:
Future checkVersion() async {
var version = await lookUpVersion();
// Do something with version
}
Note:
虽然异步函数可能执行耗时的操作,但它不会等待这些操作。 相反,异步函数只在遇到第一个await表达式(详细信息)时执行。 然后它返回一个Future对象,仅在await表达式完成后才恢复执行。
使用try,catch,finally 来处理await的代码中错误和清理:
try {
version = await lookUpVersion();
} catch (e) {
// React to inability to look up the version
}
您可以在异步函数中多次使用等待。 例如,以下代码等待三次函数结果:
var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);
在await表达式中,表达式的值通常是Future; 如果不是,那么该值将自动包装在Future中。 此Future对象表示一个返回对象的承诺。 await表达式的值是返回的对象。 await表达式使执行暂停,直到该对象可用。
如果在使用await时遇到编译时错误,请确保await在异步函数中。 例如,要在应用程序的main()函数中使用await,main()的主体必须标记为async:
Future main() async {
checkVersion();
print('In main: version is ${await lookUpVersion()}');
}
声明异步函数
异步函数的函数体用async标记。
用async标记函数会使其返回Future对象:
//同步函数
String lookUpVersion() => '1.0.0';
//异步函数
Future<String> lookUpVersion() async => '1.0.0';
如果不返回有用值,就返回Future<void>
。
处理Stream
当您需要从Stream获取值时,您有两个选择:
使用async和异步for循环(await for)。
使用Stream API,如库浏览中所述。
注意:在使用await之前,请确保它使代码更清晰,并且您确实希望等待所有流的结果。 例如,您通常不应该使用await for UI事件侦听器,因为UI框架会发送无穷无尽的事件流。
异步for循环具有以下形式:
await for (varOrType identifier in expression) {
// Executes each time the stream emits a value.
}
表达式的值必须具有Stream类型。 执行过程如下:
1.等到流发出一个值。
2.执行for循环的主体,将变量设置为该发出的值。
3.重复1和2,直到关闭流。
要停止侦听流,您可以使用break或return语句,该语句会中断for循环并从流中取消订阅。
Future main() async {
// ...
await for (var request in requestServer) {
handleRequest(request);
}
// ...
}
异步编程的更多信息请看 dart:async . 文章 Dart Language Asynchrony Support: Phase 1 Dart Language Asynchrony Support: Phase 2, Dart language specification.