Dart4Flutter -01 – 變量, 類型和 函數網絡
Dart4Flutter -拾遺01 - flutter-dart環境搭建post
引入async庫,獲取異步的支持3d
import 'dart:async';
main(List<String> args) {
}
複製代碼
async 庫中有一個叫Future的東西。Future是基於觀察者模式的。若是你熟悉Rx或者JavaScript的Promises,你就明白了。code
簡單說,一個Future定義一個將來要發生的事,例如,未來一個值返回給咱們。來讓咱們看看Future實際怎麼用。cdn
Future是支持泛型的,例如Future,經過T指定未來返回值的類型。
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
}
Future<String> getAJoke() {
return new Future<String>(() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製代碼
咱們定義了一個叫getAJoke
的函數,返回值爲Future<String>
.你能夠經過new
關鍵字建立一個Future。Future的構造函數,須要一個函數做爲參數,這個函數返回T
類型的數據。在匿名函數中的返回值就是Future的返回值。
在main函數中,咱們調用了getAJoke
方法,他返回Future<String>
.咱們經過調用then
方法訂閱Future,在then
中註冊回調函數,當Future返回值時調用註冊函數。同時註冊了catchError
方法處理在Future執行之間發生的異常。在上面的例子中不會發生異常。
下面的例子是會發生異常的例子。
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
}
Future<String> getAJoke() {
return new Future<String>(() {
//Do a long running task. E.g. Network Call.
//Return the result
throw new Exception('No joke for you!');
return "This is a joke";
});
}
複製代碼
如今咱們的例子都是會當即返回的,可是在生產環境中都是一些耗時的操做,例如,網絡調用,咱們可使用Future.delayed()
模仿
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
}
Future<String> getAJoke() {
return new Future<String>.delayed(new Duration(milliseconds: 2000),() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製代碼
如今若是你運行,你將須要2秒,才能返回結果。如今看另外一個例子。
import 'dart:async';
main(List<String> args) {
getAJoke().then((value) {
print(value);
})
.catchError((error) {
print('Error');
});
print('Another print statement.');
}
Future<String> getAJoke() {
return new Future<String>.delayed(new Duration(milliseconds: 2000),() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製代碼
如上所示,在調用函數以後,咱們添加了print語句。在這種場景中,print語句會先執行,以後future的返回值纔會打印。這是future的預期行爲.可是若是咱們但願在執行其餘語句以前,先執行future。因此咱們須要用到async/await
.
import 'dart:async';
main(List<String> args) async {
try {
String result = await getAJoke();
print(result);
} catch(e) {
print(e);
}
print('Another print statement.');
}
Future<String> getAJoke() {
return new Future<String>.delayed(new Duration(milliseconds: 2000),() {
//Do a long running task. E.g. Network Call.
//Return the result
return "This is a joke";
});
}
複製代碼
如上所示,咱們在main函數的花括號開始添加async
關鍵字。咱們添加await
關鍵字在調用getAJoke
方法以前,他所作的就是在future返回值以後,繼續往下執行。咱們將整個代碼包裹在try-catch中,咱們想捕獲全部的異常,和以前使用catchError回調是同樣。使用awiat
關鍵字,必須給函數添加async
關鍵字,不然沒有效果。
結束
參考