乐趣区

关于dart:dart系列之在dart中使用生成器

简介

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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

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

退出移动版