目录

异步支持

Dart 库中充满了返回 FutureStream 对象的函数。这些函数是异步的:它们在设置一个可能耗时的操作(例如 I/O)后返回,而无需等待该操作完成。

asyncawait 关键字支持异步编程,让您编写看起来类似于同步代码的异步代码。

处理 Future

#

当您需要已完成的 Future 的结果时,您有两种选择:

使用 asyncawait 的代码是异步的,但它看起来很像同步代码。例如,以下是一些使用 await 等待异步函数结果的代码:

dart
await lookUpVersion();

要使用 await,代码必须位于 async 函数中,即标记为 async 的函数。

dart
Future<void> checkVersion() async {
  var version = await lookUpVersion();
  // Do something with version
}

使用 trycatchfinally 来处理使用 await 的代码中的错误和清理操作。

dart
try {
  version = await lookUpVersion();
} catch (e) {
  // React to inability to look up the version
}

您可以在 async 函数中多次使用 await。例如,以下代码等待函数结果三次:

dart
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() 函数中使用 awaitmain() 的主体必须标记为 async

dart
void main() async {
  checkVersion();
  print('In main: version is ${await lookUpVersion()}');
}

有关使用 future、asyncawait 的交互式介绍,请参阅异步编程教程

声明异步函数

#

async 函数是主体用 async 修饰符标记的函数。

async 关键字添加到函数会使其返回 Future。例如,考虑以下返回 String 的同步函数:

dart
String lookUpVersion() => '1.0.0';

如果您将其更改为 async 函数(例如,因为 future 实现会耗时),则返回的值是 Future:

dart
Future<String> lookUpVersion() async => '1.0.0';

请注意,函数的主体不需要使用 Future API。Dart 会在必要时创建 Future 对象。如果您的函数没有返回有用的值,请将其返回类型设置为 Future<void>

有关使用 future、asyncawait 的交互式介绍,请参阅异步编程教程

处理 Stream

#

当您需要从 Stream 获取值时,您有两种选择:

  • 使用 async异步 for 循环 (await for)。
  • 使用 Stream API,如 dart:async 文档中所述。

异步 for 循环具有以下形式:

dart
await for (varOrType identifier in expression) {
  // Executes each time the stream emits a value.
}

expression 的值必须具有类型 Stream。执行过程如下:

  1. 等待 stream 发出值。
  2. 执行 for 循环的主体,将变量设置为该发出的值。
  3. 重复 1 和 2,直到 stream 关闭。

要停止监听 stream,可以使用 breakreturn 语句,这将跳出 for 循环并取消订阅 stream。

如果在实现异步 for 循环时收到编译时错误,请确保 await for 位于 async 函数中。例如,要在应用程序的 main() 函数中使用异步 for 循环,main() 的主体必须标记为 async

dart
void main() async {
  // ...
  await for (final request in requestServer) {
    handleRequest(request);
  }
  // ...
}

有关 Dart 异步编程支持的更多信息,请查看 dart:async 库文档。