Dart语法快速上手六 《Dart2之异步、生成器 And So On》

异步是所有开发语言中非常重要的一环,在执行耗时操作的时候不会让主线程长时间无响应,这一点在移动端开发中尤其重要

Dart库中包含许多返回Future或Stream对象的函数。
这些函数是异步的:它们在设置可能耗时的操作(例如I / O)后返回,而不等待该操作完成。

Futures

async和await关键字支持异步编程,允许您编写看起来类似于同步代码的异步代码。

await关键字在Dart2中才加入其中
使用异步的方法有两个,第一个是使用await 另外一个是使用Future Api

使用async和await的代码是异步的,但它看起来很像同步代码。
例如,这里有一些代码使用await来等待异步函数的结果:

await lookUpVersion();

要使用await关键字,需要在async包裹的代码块方法中使用

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

注意:虽然异步函数可能执行耗时的操作,但它不会等待这些操作。
相反,异步函数只在遇到第一个await表达式(详细信息)时才会执行。
然后它返回一个Future对象,仅在await表达式完成后才恢复执行。

你也可以针对await进行一个try catch 防止出现异常

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

你也可以多次使用await来执行多次耗时操作

var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);

以 async 关键字声明的方法必须返回一个Future的对象,如果你需要返回一个有用的值,请将该对象加入到泛型里面

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

Steam Api

当您需要从Stream获取值时,您有两个选择:使用async和异步for循环(等待)
或者使用Stream API,如库浏览中所述。

注意:在使用await for前,请确保它使代码更清晰,并且您确实希望等待所有流的结果。
例如,您通常不应该使用await for UI事件侦听器,因为UI框架会发送无穷无尽的事件流。

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

await for (varOrType identifier in expression) {
  // Executes each time the stream emits a value. 这个expression需要是一个事件流列表
}

表达式的值必须具有Stream类型。
执行过程如下:
1.等到流发出一个值。
2.执行for循环的主体,将变量设置为该发出的值。
3.重复1和2,直到关闭流。
要停止侦听流,可以使用break或return语句,该语句会从for循环中断开并从流中取消取消。

生成器

当您需要懒加载一个序列的值时,请考虑使用生成器函数。Dart内置支持两种生成器功能:同步和异步

要实现同步生成器函数,请将函数体标记为sync *,并使用yield语句来传递值:

Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

异步的写法很类似,区别就在于关键字

Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}

如果您的生成器是递归的,则可以使用yield *来提高其性能:

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}

可调用的类

如果你想你的类可以像方法一样去调用的话,你需要在类里面增加一个call方法

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 目录 参考资料 语言特性 关键字 变量与常量 数据类型 运算符 operators 控制流程语句 异常 Excep...
    GuoDongW阅读 185,482评论 22 341
  • 转一篇驹神的关于异步编程和Asyncio的文章。这是上篇,共三篇。原文地址:http://aju.space/20...
    SeanCheney阅读 9,851评论 2 99
  • 最近听了叫魂的听书,很有启发。所谓的启发,并不是所谓的作者的结论,或者说古人的愚昧。而是我通过这本书让我建立了看待...
    王司徒下路对线阅读 478评论 0 0
  • 这题竟然无耻地选D,真是让人难受。存在争议,为什么不能够先诉讼,理清楚争议之后,该履行缴税义务再缴税,否则就不交!
    江佩弦阅读 228评论 0 0