异步支持
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();
// Do something with version
}
使用 try
、catch
和 finally
来处理在使用 await
的代码中的错误和清理
try {
version = await lookUpVersion();
} catch (e) {
// React to inability to look up the version
}
您可以在一个 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('In main: version is ${await lookUpVersion()}');
}
有关使用 Future、async
和 await
的交互式介绍,请参阅异步编程教程。
声明 async 函数
#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>
。
有关使用 Future、async
和 await
的交互式介绍,请参阅异步编程教程。
处理 Stream
#当您需要从 Stream 获取值时,您有两种选择
- 使用
async
和异步 for 循环 (await for
)。 - 使用 Stream API,如
dart:async
文档中所述。
异步 for 循环具有以下形式
await for (varOrType identifier in expression) {
// Executes each time the stream emits a value.
}
expression
的值必须具有 Stream 类型。执行过程如下
- 等待直到 Stream 发出一个值。
- 执行 for 循环的主体,变量设置为该发出的值。
- 重复步骤 1 和 2,直到 Stream 关闭。
要停止监听 Stream,您可以使用 break
或 return
语句,这将跳出 for 循环并取消订阅 Stream。
如果您在实现异步 for 循环时收到编译时错误,请确保 await for
位于 async
函数中。 例如,要在您的应用程序的 main()
函数中使用异步 for 循环,main()
的主体必须标记为 async
void main() async {
// ...
await for (final request in requestServer) {
handleRequest(request);
}
// ...
}
有关 Dart 异步编程支持的更多信息,请查看 dart:async
库文档。
除非另有说明,否则本网站上的文档反映的是 Dart 3.7.1 版本。页面上次更新于 2024-11-17。 查看源代码 或 报告问题。