Dart库充满了返回Future
或Stream
对象的函数。 这些函数都是异步的:它们在设置可能耗时的操做(例如I/O)以后返回,而无需等待该操做完成。git
async
和await
关键字支持异步编程,使你能够编写看起来相似于同步代码的异步代码。github
当你须要一个已经完成的 Future 结果,能够有两个方式:express
async
和 await
使用async
和await
的代码是异步的,可是看起来很像同步代码。 例如,下面是一些使用await
等待异步函数结果的代码:编程
await lookUpVersion();
复制代码
要使用await
,代码必须位于async
函数中,该函数被标记为async
:框架
Future checkVersion() async {
var version = await lookUpVersion();
// 用version干些事情
}
复制代码
注意:尽管异步功能可能会执行耗时的操做,但它不会等待这些操做。 相反,异步函数仅在遇到第一个await表达式(详情)以前执行。 而后,它返回Future对象,仅在await表达式完成后才恢复执行。异步
使用try
,catch
,finally
去处理错误,而且使用await
清理代码async
try {
version = await lookUpVersion();
} catch (e) {
// 应对 lookUpVersion()失败的状况
}
复制代码
你能够在async
函数中屡次使用await
。 例如,如下代码等待三遍函数结果:ide
var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);
复制代码
在await表达式
中,表达式
的值一般是Future; 若是不是,则该值将自动包装在Future中。 此Future对象指示返回一个对象的承诺。 await表达式
的值是返回的对象。 await表达式使执行暂停,直到该对象可用为止。异步编程
**若是在使用await
时收到编译时错误,请确保await
在async
函数中。**例如,要在应用程序的main()
函数中使用await
,必须将main()
的正文标记为async
:函数
Future main() async {
checkVersion();
print('In main: version is ${await lookUpVersion()}');
}
复制代码
async
函数是一个主体带有async
修饰符的函数。
向函数添加async
关键字使其返回Future。 例如,考虑如下同步函数,该函数返回一个String:
String lookUpVersion() => '1.0.0';
复制代码
若是将其更改成async
函数(例如,因为未来的实现会很耗时),则返回的值将为Future:
Future<String> lookUpVersion() async => '1.0.0';
复制代码
请注意,该函数的主体不须要使用Future API。 Dart会在必要时建立Future对象。 若是你的函数没有返回有用的值,请使其返回类型为Future<void>
。
有关使用futures,async和await的交互式介绍,请参见异步编程代码实验室。
当你须要从流中获取值,你有两种方式:
async
和一个异步的for循环(await for
)注意:在使用
await
以前,请确保它使代码更清晰,而且你确确实实要等待全部流的结果。 例如,你一般不该将await
用于UI事件侦听器,由于UI框架发送无休止的事件流。
一个异步循环有如下格式:
await for (varOrType identifier in expression) {
// 每次执行steam(流)都会发出一个值。
}
复制代码
表达式
的值必须具备Stream类型。 执行过程以下:
要中止监听流,可使用break
或return
语句,该语句会脱离for循环并取消订阅流。
若是在实现异步for循环时遇到编译时错误,请确保await for
位于async
函数中。 例如,要在应用程序的main()
函数中使用异步for循环,必须将main()
的正文标记为async
:
Future main() async {
// ...
await for (var request in requestServer) {
handleRequest(request);
}
// ...
}
复制代码
一般,有关异步编程的更多信息,请参见库介绍的dart:async部分。