dart(五)--异步、生成器

异步

async,await 可以使同步代码异步执行。只有在async的函数里可以使用await。该函数执行到await时将暂停,等待await后的表达式执行完成。

使用try-catch来捕捉await的worry、error。

async函数的返回值为Future,任何返回值系统都将包装为Future类型。

import 'dart:async';        //使用async必须引用对应库

Future looUpVersion() async => '1.1.0'; //声明

void main() async {     //使用await必须在async的函数体中
    var version;
    try{
        version = await looUpVersion();
        print(version);
    }catch(e){
        print(e);
        return;
    }
}

Stream Api

可以简单地认为 Stream 是一个异步数据源;

使用await for和Stream读取序列值,可以使用break、return来中止;

void async() {
    //stream是声明一个可读取序列值
    var arr = Stream.fromIterable([1,2,3]); 
     //类似于for-in循环表达式
    await for (var v in arr){  
        //若arr流中是一组耗时的操作,那么print将会在变量v获取成功后执行,且发出该值进入一下次循环。
        print(v);
    }
}

生成器

惰性地生成序列值,如:超大量的数据、无穷的数量。

同步生成器 sync+yield

Interable natre(int n) sync* {
    int k = 0;
    while(n < k) yield k++;
}

void main() {
    for (var v in natre(3)){
        print(v);   //输出1 2 3
    }
}

异步生成器 async+yield,返回值Stream使用await for来使用。

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

void main() {
    await for (var v in natre(3)){
        print(v);   //输出1 2 3
    }
}

如果您的生成器是递归的,您可以使用yield来改进它的性能,yield 指定一个生成器。

Iterable naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
    /*
        for (var i in naturalsDownFrom(n - 1)){ yield i;}
        和上一句效果相同。
    */
  }
}
void main() {
    for (var v in naturalsDownFrom(3)){
        print(v);   //输出3 2 1
    }
}

你可能感兴趣的:(dart(五)--异步、生成器)