异步支持
Dart 库中充满了返回 Future 或 Stream 对象的函数。这些函数是 异步 的:它们在设置可能耗时的操作(例如 I/O)后返回,而无需等待该操作完成。
async 和 await 关键字支持异步编程,允许您编写看起来类似于同步代码的异步代码。
处理 Future
#当您需要已完成 Future 的结果时,您有两个选择:
- 使用
async和await,此处和 异步编程教程 中有描述。 - 使用 Future API,如
dart:async文档 中所述。
使用 async 和 await 的代码是异步的,但它看起来非常像同步代码。例如,这是一些使用 await 等待异步函数结果的代码:
await lookUpVersion();要使用 await ,代码必须位于 async 函数中——一个标记为 async 的函数:
Future<void> checkVersion() async {
var version = await lookUpVersion();
// 使用 version 执行某些操作
}使用 try 、 catch 和 finally 处理使用 await 的代码中的错误和清理:
try {
version = await lookUpVersion();
} catch (e) {
// 对无法查找版本做出反应
}您可以在 async 函数中多次使用 await 。例如,以下代码三次等待函数的结果:
var entrypoint = await findEntryPoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);在 await expression 中,expression 的值通常是 Future;如果不是,则该值会自动包装在 Future 中。此 Future 对象表示返回对象的承诺。await expression 的值是返回的对象。await 表达式使执行暂停,直到该对象可用。
如果您在使用 await 时遇到编译时错误,请确保 await 位于 async 函数中。 例如,要在应用程序的 main() 函数中使用 await , main() 的主体必须标记为 async :
void main() async {
checkVersion();
print('在 main 中:版本是 ${await lookUpVersion()}');
}有关使用 future、 async 和 await 的交互式介绍,请参阅 异步编程教程 。
声明 async 函数
#async 函数是一个其主体用 async 修饰符标记的函数。
向函数添加 async 关键字使其返回 Future。例如,考虑这个同步函数,它返回一个字符串:
String lookUpVersion() => '1.0.0';如果您将其更改为 async 函数——例如,因为将来的实现将很耗时——则返回值为 Future:
Future<String> lookUpVersion() async => '1.0.0';请注意,函数的主体不需要使用 Future API。如果需要,Dart 会创建 Future 对象。如果您的函数没有返回值,请将其返回类型设为 Future<void> 。
有关使用 future、 async 和 await 的交互式介绍,请参阅 异步编程教程 。
处理 Stream
#当您需要从 Stream 获取值时,您有两个选择:
- 使用
async和_异步 for 循环_(await for)。 - 使用 Stream API,如
dart:async文档 中所述。
异步 for 循环具有以下形式:
await for (varOrType identifier in expression) {
// 每次流发出值时执行。
}expression 的值必须具有 Stream 类型。执行过程如下:
- 等待流发出值。
- 执行 for 循环的主体,将变量设置为发出的值。
- 重复步骤 1 和 2,直到流关闭。
要停止侦听流,您可以使用 break 或 return 语句,这将中断 for 循环并取消订阅流。
如果您在实现异步 for 循环时遇到编译时错误,请确保 await for 位于 async 函数中。 例如,要在应用程序的 main() 函数中使用异步 for 循环, main() 的主体必须标记为 async :
void main() async {
// ...
await for (final request in requestServer) {
handleRequest(request);
}
// ...
}有关 Dart 异步编程支持的更多信息,请查看 dart:async 库文档。
除非另有说明,否则本网站上的文档反映的是 Dart 3.6.0。页面最后更新于 2025-02-05。 查看源代码 或 报告问题.