【dart学习】-- Dart之async和await

一,概述

在Dart1.9中加入了asyncawait关键字,有了这两个关键字,咱们能够更简洁的编写异步代码,而不须要调用Future相关的API。他们容许你像写同步代码同样写异步代码和不须要使用Future接口。至关于都Future相关API接口的另外一种封装,提供了一种更加简便的操做Future相关API的方法java

     将 async 关键字做为方法声明的后缀时,具备以下意义异步

  • 被修饰的方法会将一个 Future 对象做为返回值
  • 该方法会同步执行其中的方法的代码直到第一个 await 关键字,而后它暂停该方法其余部分的执行;
  • 一旦由 await 关键字引用的 Future 任务执行完成,await的下一行代码将当即执行。

二,Async/await 示例解析

  • 示例一:
    使用Async/await也是能够实现异步操做,下面直接上例子:
    main() {
      create();
    }
    void create(){
       String data =  getData();
       print(data);
       print("I love Future");
    }
    getData() async{
      return await "I love Android";
    }

    运行上面代码,报错了:async

    type 'Future<dynamic>' is not a subtype of type 'String'

    报的是类型不匹配?为何呢?通过一番搜查,发现getData是一个异步操做函数,它的返回值是一个await延迟执行的结果。在Dart中,有await标记的运算,其结果值是一个Future对象,Future并非String类型,就报错了。那么怎么才正确得到异步的结果呢?Dart规定async标记的函数,只能由await来调用,下面改为这样:函数

    main() {
      create();
    }
    
    void create() async{
       String data =  await getData();
       print(data);
       print("I love Future");
    }
    getData() async{
    return await "I love Android"; }

    下面直接去掉async函数包装,直接在getData方法里对data进行赋值:spa

    String data;
    main() {
      create();
    }
    void create(){ getData(); print("I love Future"); }
    getData() async{ data
    = await "I love Android"; print(data); }

    上面输出结果是:code

    I love Future
    I love Android

    能够发现,先输出的是I love Future后面再输出I love Android,能够发现当函数被async修饰时,会先去执行下面的操做,当下面的操做执行完,而后再执行被async修饰的方法。async用来表示函数是异步的,定义的函数会返回一个Future对象,await后面是一个Future,表示等待该异步任务完成,异步完成后才会往下走。要注意如下几点:对象

    1. await关键字必须在async函数内部使用,也就是加await不加async会报错。
    2. 调用async函数必须使用await关键字,若是加async不加await会顺序执行代码。
      PS: await 关键字真的很形象,等一等的意思,就是说,既然你运行的时候都要等一等,那我调用的时候也要等等吧。
  • 示例二:
    main() {
      _startMethod();
      _method_C();
    
    }
    
    _startMethod() async{
      _method_A();
      await _method_B();
      print("start结束");
    }
    _method_A(){
      print("A开始执行这个方法~");
    
    }
    
    _method_B() async {
      print("B开始执行这个方法~");
      await  print("后面执行这句话~");
      print("继续执行这句哈11111~");
    }
    
    _method_C(){
      print("C开始");
    }

    结果以下:blog

    A开始执行这个方法~
    B开始执行这个方法~
    后面执行这句话~
    C开始
    继续执行这句哈11111~
    start结束

  过程分析:
接口

    1. 当使用async做为方法名后缀声明时,说明这个方法的返回值是一个Future
    2. 当执行到该方法代码用await关键字标注时,会暂停该方法其余部分执行;
    3. await关键字引用的Future执行完成,下一行代码会当即执行。
也就是首先执行_startMethod这个方法用async声明了,由于方法里调用了_method_A,因此先输出print("A开始执行这个方法~");,后面执行_method_B(),这个方法用await关键字声明,因此会暂停print("start结束");的执行,而后继续执行_method_B()print("B开始执行这个方法~");输出,下一行遇到await关键字,会暂停其余代码的执行。当await关键字引用的Future执行完成(也就是执行print("后面执行这句话~"),_method_C()方法会当即执行,而后执行继续执行这句哈11111~,最后执行print("start结束"); _startMethod_method_A_method_B()_method_B()_method_C()
相关文章
相关标签/搜索