Dart4Flutter – 04 – 異步和庫

Dart4Flutter -01 – 變量, 類型和 函數網絡

Dart4Flutter – 02 –控制流 和異常異步

Dart4Flutter – 03 – 類和泛型async

Dart4Flutter – 04 – 異步和庫函數

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

flutter入門 - 狀態管理ui

Flutter 入門實例1spa

引入第三方庫

引入async庫,獲取異步的支持3d

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

Future

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.

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

結束

參考

thetechnocafe.com/just-enough…

相關文章
相關標籤/搜索