简介

ES6中在引入异步编程的同时,也引入了Generators,通过yield关键词来生成对应的数据。同样的dart也有yield关键词和生成器的概念。

什么时候生成器呢?所谓生成器就是一个能够持续产生某些数据的装置,也叫做generator。

两种返回类型的generator

根据是同步生成还是异步生成,dart返回的结果也是不同的。

如果是同步返回,那么返回的是一个Iterable对象.

如果是异步返回,那么返回的是一个Stream对象。

同步的generator使用sync*关键词如下:

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

异步的generator使用的是async* 关键词如下:

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

生成关键词使用的是yield。

如果yield后面跟着的本身就是一个generator,那么需要使用yield*。

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

Stream的操作

stream表示的是流,得到这个流之后,我们需要从流中取出对应的数据。

从Stream中取出数据有两种方式,第一种就是使用Stream本身的API来获取Stream中的数据。

最简单的就是调用stream的listen方法:

  StreamSubscription<T> listen(void onData(T event)?,
{Function? onError, void onDone()?, bool? cancelOnError});

listen可以接数据的处理方法,具体使用如下:

 final startingDir = Directory(searchPath);
startingDir.list().listen((entity) {
if (entity is File) {
searchFile(entity, searchTerms);
}
});

默认的方法是onData方法。

另外一种就是今天要讲解的await for.

await for的语法如下:

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

要注意的是上面的expression必须是一个Stream对象。并且await for必须用在async中,如下:

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

如果要想中断对stream的监听,则可以使用break或者return。

总结

以上就是dart中生成器的使用了。

本文已收录于 http://www.flydean.com/13-dart-generators/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

最新文章

  1. fzu2188 状压dp
  2. 设计模式:享元模式(Flyweight)
  3. 转:Qt编写串口通信程序全程图文讲解
  4. .Net XML操作 &lt;第二篇&gt;
  5. @RenderSection
  6. 老oj1965:polygon半平面交
  7. 二叉搜索树Java实现(查找、插入、删除、遍历)
  8. iOS原生地图与高德地图的使用
  9. 并归排序 (Java版本,时间复杂度为O(n))
  10. Sagit.Framework For IOS 开发框架入门教程4:注册页布局-被消灭的变量
  11. java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer; at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.jav
  12. mysql 替换字符中部分字符,替换使用指定字符
  13. WeUI0.6.0有一个Calendar在浏览器下无法直接打开问题
  14. react的dva框架初试
  15. 自己动手制作的淘宝闲鱼APP宝贝数据采集工具软件
  16. vs2013 error LNK2005 已经在***.obj中定义
  17. python中的selectors模块
  18. Cisco N3K VPC+HSRP+ospf 配置
  19. 【已处理完】Centos 6.5版本,df -h出来的容量与du -sh的容量不对应是怎么会事呢?
  20. [C#.net]Connection Timeout和Command Timeout

热门文章

  1. Java JDK的下载与安装!Java基础
  2. Git: 搭建一个本地私人仓库
  3. 修改git仓库的远程地址
  4. netty系列之:netty实现http2中的流控制
  5. triangle leetcode C++
  6. 跟着老猫来搞GO,基础进阶
  7. Navicat for MySQL 批量执行多个 SQL 文件
  8. SpringCould | Nacos与Feign
  9. javascript 深拷贝与浅拷贝
  10. 三. 为什么要用Promise