在Dart1.9中加入了async和await關鍵字,有了這兩個關鍵字,咱們能夠更簡潔的編寫異步代碼,而不須要調用Future相關的API。他們容許你像寫同步代碼同樣寫異步代碼和不須要使用Future接口。至關於都Future相關API接口的另外一種封裝,提供了一種更加簡便的操做Future相關API的方法java
將 async 關鍵字做爲方法聲明的後綴時,具備以下意義異步
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
,表示等待該異步任務完成,異步完成後纔會往下走。要注意如下幾點:對象
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結束
過程分析:
接口
也就是首先執行_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()