Dart異步編程Future

Dart是單線程編程語言,若是執行了阻塞線程代碼就會形成程序卡死,異步操做就是爲了防止這一現象。 Future相似於ES6中Promise,也提供了then和catchError鏈式調用。java

Future常見用法

  • 使用future.then獲取future值or獲取異常
  • 一般結合async和await使用
  • future.whenComplete
  • future.timeout
future.then使用
main() {
  testFuture().then((value){
    print(value);
  },onError: (e) {
    print("onError: \$e");
  }).catchError((e){
    print("catchError: \$e");
  });
}

Future<String> testFuture() {
   return Future.value("Hello");
//  return Future.error("yxjie 創造個error");//onError會打印
//  throw "an Error";
}
複製代碼

注:直接throw "an Error"代碼會直接異常不會走 catchError方法,由於throw返回的數據類型不是Future類型,then方法onError未可選參數,代碼異常時會被調用【代碼中有onError回調,catchError不會執行】數據庫

async和await使用
import 'dart:async';
test() async {
  var result = await Future.delayed(Duration(milliseconds: 2000), ()=>Future.value("hahha"));
  print("time = \${DateTime.now()}");
  print(result);
}


main() {
  print("time start = \${DateTime.now()}");
  test();
  print("time end= \${DateTime.now()}");

  //執行結果:
  //time start = 2019-05-15 19:24:14.187961
  //time end= 2019-05-15 19:24:14.200480
  //time = 2019-05-15 19:24:16.213213
  //hahha
}
複製代碼
future.whenComplete使用

此方法相似於java中try{}catch(){}finally{}異常捕獲的finally編程

main() {
  Future.error("yxjie make a error")
      .then(print)
      .catchError(print)
      .whenComplete(() => print("Done!!!"));
  
  //執行結果:
  //yxjie make a error
  //Done!!!
}
複製代碼

以上demo用了方法對象以及插值表達式,不瞭解方法對象能夠參考此文bash

future.timeout使用

異步操做可能須要很長時間,如訪問數據庫or網絡請求等,咱們能夠使用timeout來設置超時操做。網絡

main() {
  Future.delayed(Duration(milliseconds: 3000), () => "hate")
      .timeout(Duration(milliseconds: 2000))
      .then(print)
      .catchError(print);
  //TimeoutException after 0:00:00.002000: Future not completed
}
複製代碼
相關文章
相關標籤/搜索