Dart语言基础之异步

原文:https://www.dartlang.org/guides/language/language-tour#asynchrony-support
Dart库中包含许多返回Future或Stream对象的函数。这些函数是异步的:它们在设置可能耗时的操作(例如I / O)后返回,而不等待该操作完成。
async和await关键字支持异步编程,允许您编写看起来类似于同步代码的异步代码。

处理Future

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

  • Use async and await.
  • 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 lookUpVersion() async => '1.0.0';

如果不返回有用值,就返回Future

处理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.

你可能感兴趣的:(Dart语言基础之异步)