最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Dart?異步編程生成器及自定義類型用法詳解

 更新時間:2022年11月01日 10:52:44   作者:SaraiNoQ  
這篇文章主要為大家介紹了Dart?異步編程生成器及自定義類型用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

異步支持

今天介紹一下 Dart 學習的最后一節(jié)內(nèi)容,包括異步的使用、生成器語法以及類型別名的使用。

Dart 類庫有非常多的返回Future或者Stream對象的函數(shù)。 這些函數(shù)被稱為異步函數(shù):它們只會在設置好一些耗時操作之后返回,比如像 IO 操作。而不是等到這個操作完成。

同時,asyncawait關鍵詞支持了異步編程,允許您寫出和同步代碼很像的異步代碼。

Future

Future與 JavaScript 中的Promise非常相似,表示一個異步操作的最終完成(或失?。┘捌浣Y(jié)果值的表示。簡單來說,它就是用于處理異步操作的,異步處理成功了就執(zhí)行成功的操作,異步處理失敗了就捕獲錯誤或者停止后續(xù)操作。一個Future 只會對應一個結(jié)果,要么成功,要么失敗。

注: Future 的所有API的返回值仍然是一個Future對象,所以可以很方便的進行鏈式調(diào)用。

Future.then

為了方便示例,在本例中使用Future.delayed 創(chuàng)建了一個延時任務(實際場景會是一個真正的耗時任務,比如一次網(wǎng)絡請求),即2秒后返回結(jié)果字符串hi world!,然后我們在then中接收異步結(jié)果并打印結(jié)果,代碼如下:

 Future.delayed(new Duration(seconds: 2),(){
    return "hi world!";
 }).then((data){
    print(data);
 });

Future.catchError

如果異步任務發(fā)生錯誤,可以在catchError中捕獲錯誤,將上面示例改為:

 Future.delayed(new Duration(seconds: 2),(){
    //return "hi world!";
    throw AssertionError("Error");  
 }).then((data){
    //執(zhí)行成功會走到這里  
    print("success");
 }).catchError((e){
    //執(zhí)行失敗會走到這里  
    print(e);
 });

then方法還有一個可選參數(shù)onError,也可以它來捕獲異常:

 Future.delayed(new Duration(seconds: 2), () {
     //return "hi world!";
     throw AssertionError("Error");
 }).then((data) {
     print("success");
 }, onError: (e) {
     print(e);
 });

Future.whenComplete

有些時候,我們會遇到無論異步任務執(zhí)行成功或失敗都需要做一些事的場景,比如在網(wǎng)絡請求前彈出加載對話框,在請求結(jié)束后關閉對話框。這種場景,有兩種方法,第一種是分別在thencatch中關閉一下對話框,第二種就是使用FuturewhenComplete回調(diào),我們將上面示例改一下:

Future.delayed(new Duration(seconds: 2),(){
   //return "hi world!";
   throw AssertionError("Error");
}).then((data){
   //執(zhí)行成功會走到這里 
   print(data);
}).catchError((e){
   //執(zhí)行失敗會走到這里   
   print(e);
}).whenComplete((){
   //無論成功或失敗都會走到這里
});

Future.wait

使用Future.wait可以做到多個Future同時出發(fā)才會進行后續(xù)操作,同 JavaScript 中的Promise.all()方法。

Future.wait接受一個Future數(shù)組參數(shù),只有數(shù)組中所有Future都執(zhí)行成功后,才會觸發(fā)then的成功回調(diào),只要有一個Future執(zhí)行失敗,就會觸發(fā)錯誤回調(diào)。下面,我們通過模擬Future.delayed 來模擬兩個數(shù)據(jù)獲取的異步任務,等兩個異步任務都執(zhí)行成功時,將兩個異步任務的結(jié)果拼接打印出來,代碼如下:

Future.wait([
  // 2秒后返回結(jié)果  
  Future.delayed(new Duration(seconds: 2), () {
    return "hello";
  }),
  // 4秒后返回結(jié)果  
  Future.delayed(new Duration(seconds: 4), () {
    return " world";
  })
]).then((results){
  print(results[0]+results[1]);
}).catchError((e){
  print(e);
});
/*
	最后會在4秒后拿到結(jié)果
*/

更多 Future 的 api 請自行查詢文檔。

async 和 await

異步函數(shù)是函數(shù)體被用async修飾符標記的函數(shù)。 向函數(shù)中添加async關鍵字將使其返回一個 Future。

String lookUpVersion() => '1.0.0'; // 返回String
Future<String> lookUpVersion() async => '1.0.0'; // 返回Future<String>

然后我們可以使用await關鍵字在內(nèi)部直接接受一個 Future 的then的成功回調(diào),就如同 JavaScript 中的那樣:

task() async {
    try{
        String id = await login("alice","******");
        String userInfo = await getUserInfo(id);
        await saveUserInfo(userInfo);
        // 執(zhí)行接下來的操作   
    } catch(e){
        // 錯誤處理   
        print(e);   
    }  
}
  • async用來表示函數(shù)是異步的,定義的函數(shù)會返回一個Future對象,可以使用then方法添加回調(diào)函數(shù)。
  • await 后面是一個Future,表示等待該異步任務完成,異步完成后才會往下走。注意,await必須出現(xiàn)在 async 函數(shù)內(nèi)部。

注意: 函數(shù)的主體不需要使用 Future 的 API。如果需要,Dart 將創(chuàng)建 Future 的對象。如果沒有返回一個有用的值,那么將其返回Future<void>類型。

處理流(Stream)

Stream 也是用于接收異步事件數(shù)據(jù),和Future 不同的是,它可以接收多個異步操作的結(jié)果(成功或失?。?。 也就是說,在執(zhí)行異步任務時,可以通過多次觸發(fā)成功或失敗事件來傳遞結(jié)果數(shù)據(jù)或錯誤異常。 Stream 常用于會多次讀取數(shù)據(jù)的異步任務場景,如網(wǎng)絡內(nèi)容下載、文件讀寫等。

當需要從 Stream 獲取值時,有兩個選擇:

使用async和異步的for循環(huán)(await for

注: 在使用await for之前,請確保它使代碼更清晰,并且確實希望等待流(Stream)的所有結(jié)果。例如,通常不應該為 UI 事件使用await,因為 UI 框架會發(fā)送無窮無盡的事件流。

異步for循環(huán)有以下形式:

 await for (varOrType identifier in expression) {
   // Executes each time the stream emits a value.
 }

表達式的值必須具有 Stream 類型。執(zhí)行過程如下:

等待流發(fā)出值。

執(zhí)行for循環(huán)的主體,并將變量設置為發(fā)出的值。

重復1和2,直到流關閉。

要停止偵聽流,可以使用breakreturn語句,該語句將跳出for循環(huán),并從流中取消訂閱。

如果在實現(xiàn)異步for循環(huán)時出現(xiàn)編譯時錯誤,請確保await在異步函數(shù)中。例如,要在應用程序的main()函數(shù)中使用異步for循環(huán),main()的主體必須標記為async

 Future main() async {
   // ...
   await for (var request in requestServer) {
     handleRequest(request);
   }
   // ...
 }

使用Stream API,如[庫的引導]中的描述

 Stream.fromFutures([
   // 1秒后返回結(jié)果
   Future.delayed(new Duration(seconds: 1), () {
     return "hello 1";
   }),
   // 拋出一個異常
   Future.delayed(new Duration(seconds: 2),(){
     throw AssertionError("Error");
   }),
   // 3秒后返回結(jié)果
   Future.delayed(new Duration(seconds: 3), () {
     return "hello 3";
   })
 ]).listen((data){
    print(data);
 }, onError: (e){
    print(e.message);
 }, onDone: (){
 
 });
 /*
 上面的代碼依次會輸出:
 I/flutter (17666): hello 1
 I/flutter (17666): Error
 I/flutter (17666): hello 3
 */

生成器

當需要延遲地生成一個值序列時,請考慮使用生成器函數(shù)。

Dart 內(nèi)置支持兩種生成器函數(shù):

  • 同步生成器:返回 Iterable 對象
  • 異步生成器:返回 Stream 對象

要實現(xiàn)同步生成器函數(shù),將函數(shù)體標記為sync*,并使用yield語句傳遞值:

Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

要實現(xiàn)異步生成器函數(shù),將函數(shù)體標記為async*,并使用yield語句傳遞值:

Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}

如果生成器是遞歸的,可以使用yield*來改進它的性能:

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}

類型定義

在 Dart 中,函數(shù)是對象,就像字符串和數(shù)字是對象一樣。typedeffunction-type為函數(shù)提供一個類型別名,可以在聲明字段和返回類型時使用這個名稱。當函數(shù)類型被分配給變量時,typedef保留類型信息。

以下代碼不使用typedef

class SortedCollection {
  Function compare;
  SortedCollection(int f(Object a, Object b)) {
    compare = f;
  }
}
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
void main() {
  SortedCollection coll = SortedCollection(sort);
  // All we know is that compare is a function,
  // but what type of function?
  assert(coll.compare is Function);
}

上面的代碼中,當給compare分配f時類型信息會丟失。f的類型是(Object, Object)->int(int表示返回值類型),當然,compare的類型是Function。如果我們更改代碼以使用顯式名稱和保留類型信息,開發(fā)人員和工具都可以使用這些信息。

typedef Compare = int Function(Object a, Object b);
class SortedCollection {
  Compare compare;
  SortedCollection(this.compare);
}
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
void main() {
  SortedCollection coll = SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}

注意: 目前,typedefs僅限于函數(shù)類型,可能在之后會有所改變。

因為typedef僅僅是別名,所以它們提供了一種檢查任何函數(shù)類型的方法。例如:

typedef Compare<T> = int Function(T a, T b);
int sort(int a, int b) => a - b;
void main() {
  assert(sort is Compare<int>); // True!
}

元數(shù)據(jù)

使用元數(shù)據(jù)提供關于代碼的附加信息。元數(shù)據(jù)注釋以字符@開頭,后跟對編譯時常量(如deprecated)的引用或?qū)ΤA繕?gòu)造函數(shù)的調(diào)用。

所有 dart 代碼都可以使用兩個注釋:@deprecated(棄用注釋)和@override。這里有一個使用@deprecated注釋的例子:

class Television {
  /// _Deprecated: Use [turnOn] instead._
  @deprecated
  void activate() {
    turnOn();
  }
  /// Turns the TV's power on.
  void turnOn() {...}
}

可以定義自己的元數(shù)據(jù)注釋(也就是類似 JavaScript 中的裝飾器的效果)。這里有一個定義帶有兩個參數(shù)的@todo注釋的示例:

 library todo;
 class Todo {
   final String who;
   final String what;
   const Todo(this.who, this.what);
 }

這里有一個使用@todo注釋的例子:

 import 'todo.dart';
 
 @Todo('seth', 'make this do something')
 void doSomething() {
   print('do something');
 }

元數(shù)據(jù)可以出現(xiàn)在庫、類、類型定義、類型參數(shù)、構(gòu)造函數(shù)、工廠、函數(shù)、字段、參數(shù)或變量聲明之前,也可以出現(xiàn)在導入或?qū)С鲋噶钪啊?梢允褂梅瓷湓谶\行時檢索元數(shù)據(jù)。

核心庫的使用

可以參考官方文檔中的介紹:A tour of the core libraries

以上就是Dart 異步編程生成器及自定義類型用法詳解的詳細內(nèi)容,更多關于Dart 異步編程生成器的資料請關注腳本之家其它相關文章!

相關文章

  • Dart語法之變量聲明與數(shù)據(jù)類型實例詳解

    Dart語法之變量聲明與數(shù)據(jù)類型實例詳解

    這篇文章主要為大家介紹了Dart語法之變量聲明與數(shù)據(jù)類型實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 關于Dart中的異步編程

    關于Dart中的異步編程

    這篇文章主要介紹了關于Dart中的異步編程,dart 是強類型語言,但由于具備類型推導功能所以類型聲明是可選的,需要的朋友可以參考下
    2023-04-04
  • 8個Dart中令人驚艷的用法詳解

    8個Dart中令人驚艷的用法詳解

    Dart是谷歌開發(fā)的現(xiàn)代化編程語言,憑借其簡潔的語法和強大的功能,在開發(fā)者當中贏得了極高的聲譽,本文將介紹Dart中的8個令人驚艷的用法,需要的可以參考下
    2024-01-01
  • Flutter入門學習Dart語言變量及基本使用概念

    Flutter入門學習Dart語言變量及基本使用概念

    這篇文章主要為大家介紹了Flutter入門學習Dart語言變量及基本使用概念,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Flutter Dart快速排序算法示例詳解

    Flutter Dart快速排序算法示例詳解

    這篇文章主要為大家介紹了Flutter Dart快速排序算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實例詳解

    Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實例詳解

    這篇文章主要為大家介紹了Dart多態(tài)控制反轉(zhuǎn)編碼規(guī)范實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Flutter學習筆記(一)配置環(huán)境

    Flutter學習筆記(一)配置環(huán)境

    這篇文章主要介紹了Flutter學習筆記(一)配置環(huán)境,Flutter?app使用了?Dart語言,源自于?Google,現(xiàn)在是?ECMA?的標準,需要的朋友可以參考下
    2023-04-04
  • Flutter SizedBox布局組件Widget使用示例詳解

    Flutter SizedBox布局組件Widget使用示例詳解

    這篇文章主要為大家介紹了Flutter SizedBox布局組件Widget使用示例詳解
    2023-02-02
  • Dart?異步編程生成器及自定義類型用法詳解

    Dart?異步編程生成器及自定義類型用法詳解

    這篇文章主要為大家介紹了Dart?異步編程生成器及自定義類型用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 淺析Dart語言的異步處理

    淺析Dart語言的異步處理

    Dart是一個單線程語言,我們在處理耗時操作的時候使用stream或者future來實現(xiàn),在這篇文章中我們將簡單的給大家聊一聊Dart語言的異步處理
    2023-06-06

最新評論

浦城县| 五河县| 白山市| 蛟河市| 中江县| 基隆市| 昆山市| 西平县| 西吉县| 内丘县| 呼伦贝尔市| 鄱阳县| 电白县| 惠东县| 凌源市| 土默特右旗| 金平| 宁晋县| 曲周县| 娱乐| 疏勒县| 涿鹿县| 汉沽区| 咸阳市| 通海县| 望城县| 洞头县| 台南市| 嘉荫县| 卓尼县| 天水市| 梁平县| 齐齐哈尔市| 浦东新区| 普陀区| 揭东县| 诸城市| 东乡| 汾西县| 乐业县| 嵊州市|