Dart4Flutter – 04 – 非同步和庫

黃馬發表於2018-06-22

Dart4Flutter -01 – 變數, 型別和 函式

Dart4Flutter – 02 –控制流 和異常

Dart4Flutter – 03 – 類和泛型

Dart4Flutter – 04 – 非同步和庫

Dart4Flutter -拾遺01 - flutter-dart環境搭建

flutter入門 - 狀態管理

Flutter 入門例項1

Dart4Flutter – 04 – 非同步和庫

引入第三方庫

引入async庫,獲取非同步的支援

import 'dart:async';
 
main(List<String> args) {
 
}
複製程式碼

Future

async 庫中有一個叫Future的東西。Future是基於觀察者模式的。如果你熟悉Rx或者JavaScript的Promises,你就明白了。

簡單說,一個Future定義一個未來要發生的事,例如,將來一個值返回給我們。來讓我們看看Future實際怎麼用。

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.

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關鍵字,否則沒有效果。

結束

Dart4Flutter – 04 – 非同步和庫

參考

thetechnocafe.com/just-enough…

相關文章