Dart 基础之异步支持

前言

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

asyncawait关键字支持异步编程,使你能够编写看起来相似于同步代码的异步代码。github

处理Futures

当你须要一个已经完成的 Future 结果,能够有两个方式:express

  • asyncawait
  • 用 Future API, 在库描述中能够找到

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

await lookUpVersion();
复制代码

要使用await代码必须位于async函数中,该函数被标记为async框架

Future checkVersion() async {
  var version = await lookUpVersion();
  // 用version干些事情
}
复制代码

注意:尽管异步功能可能会执行耗时的操做,但它不会等待这些操做。 相反,异步函数仅在遇到第一个await表达式(详情)以前执行。 而后,它返回Future对象,仅在await表达式完成后才恢复执行。异步

使用trycatchfinally去处理错误,而且使用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时收到编译时错误,请确保awaitasync函数中。**例如,要在应用程序的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)
  • 用Stream API, 在库描述中能够找到

注意:在使用await以前,请确保它使代码更清晰,而且你确确实实要等待全部流的结果。 例如,你一般不该将await用于UI事件侦听器,由于UI框架发送无休止的事件流。

一个异步循环有如下格式:

await for (varOrType identifier in expression) {
  // 每次执行steam(流)都会发出一个值。
}
复制代码

表达式的值必须具备Stream类型。 执行过程以下:

  1. 会等到流发出一个值为止
  2. 执行for循环体,并将变量设置为该发射值。
  3. 重复1和2,直到关闭流。

要中止监听流,可使用breakreturn语句,该语句会脱离for循环并取消订阅流。

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

Future main() async {
  // ...
  await for (var request in requestServer) {
    handleRequest(request);
  }
  // ...
}
复制代码

一般,有关异步编程的更多信息,请参见库介绍的dart:async部分。

相关文章
相关标签/搜索