简介
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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!