【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()
相關文章
相關標籤/搜索