91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dart中的異步編程怎么使用

發布時間:2023-04-18 17:09:47 來源:億速云 閱讀:102 作者:iii 欄目:開發技術

這篇文章主要講解了“Dart中的異步編程怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Dart中的異步編程怎么使用”吧!

一 事件循環

flutter 就是運行在一個root isolate 中

程序只要運行起來,就有一個事件循環一直在運行 ,直至程序退出。

EventLoop 先從mrcro 對列中取任務,取完任務再去 event 隊列中取任務。隊列任務是FIFO。

Dart中的異步編程怎么使用

二 認識Future

abstract class Future<T>

Future 是Dart 中提供的一個抽象類,泛型類,它用于封裝一段在將來會被執行的代碼邏輯。

Future就是異步中非常重要的角色。Future表示異步返回的結果,當執行一個異步延遲的計算時候,首先會返回一個Future結果,后續代碼可以繼續執行不會阻塞主isolate,當Future中的計算結果到達時,如果注冊了 then 函數回調,對于返回成功的回調就會拿到最終計算的值,對于返回失敗的回調就會拿到一個異常信息

1  基本使用

Flutter提供了下面三個方法,讓我們來注冊回調,來監聽處理Future的結果。

//處理完成時候的回調,一般都是成功回調
Future<R> then<R>(FutureOr<R> onValue(T value), {Function onError});
//處理失敗的回調,比如throw一個error就會走到這里
Future<T> catchError(Function onError, {bool test(Object error)});
//Future.whenComplete總是在Future完成后調用,不管Future的結果是正確的還是錯誤的。
Future<T> whenComplete(FutureOr action());

 代碼示例:

import 'dart:io';
 
main(List<String> args) {
  // 阻塞主線程的調用
  // blockMainThread();
  // 異步調用
  asyncMethod();
}
 
/*****----- 異步的調用方式 ---***/
void asyncMethod() {
  /**
   * main start
    main end
    hello world
   * */
  print("main start");
  var future = getAsyncNetworkData();
  future.then((String value) {
    // 只有拿到結果 才會執行這里面的代碼
    print(value);
  }).catchError((error) {
    // 打印結果 Exception: 我是錯誤信息
    print(error);
  }).whenComplete(() {
    // 代碼走這,不管成功或者失敗都會走這里
    print("代碼執行完畢");
  });
  print("main end");
}
 
Future<String> getAsyncNetworkData() {
  return Future<String>(() {
    sleep(Duration(seconds: 3));
    // return "hello world";
 
    // 拋出異常
    throw Exception("我是錯誤信息");
  });
}
 
/*****----- 阻塞主線程的調用方式 ---***/
void blockMainThread() {
  /**
   * main start
    this is hello world
    main end
   * 
  */
  print("main start");
  var res = getNetworkData();
  print(res);
  print("main end");
}
 
// 模擬網絡請求
String getNetworkData() {
  // 阻塞2秒
  sleep(Duration(seconds: 2));
  return "this is hello world";
}

2 鏈式調用

  鏈式調用優勢在于可以明確代碼執行前后依賴關系以及實現異常的捕獲

import 'dart:io';
 
main(List<String> args) {
  print("main start");
  /**
   * main start
    main end
    第一次網絡請求的結果
    第二次網路請求的結果
    第三次網路請求的結果
   * 
   * */
  // 這種方式可以解決回調地獄的問題 多個網絡請求依賴也不用進行嵌套調用 直接鏈式調用即可
  Future(() {
    // 這是第一次網絡請求
    sleep(Duration(seconds: 2));
    return "第一次網絡請求的結果";
  })
      .then((res) {
        print(res);
        sleep(Duration(seconds: 2));
        // 這是第二次網絡請求
        return "第二次網路請求的結果";
      })
      .then((res) {
        print(res);
        sleep(Duration(seconds: 2));
        return "第三次網路請求的結果";
      })
      .then((value) => print(value))
      .catchError((error) {
        print(error);
      });
  print("main end");
}

三 await 和 async

要定義異步函數,請在函數主體之前添加async關鍵字,他倆是配對出現的

他們是dart 語言中的關鍵字,最為重要的使用就是

可以讓我們用同步的代碼格式去實現異步的調用過程。  

大部分Future使用的場景都可以使用async-await來替代,也建議使用async-await。

下面有這樣一個需求 :比如說用戶登錄完成之后,拿到用戶的token 去請求數據,就是請求之間的依賴

用 await async 方式實現 和 Future 實現比較

import 'dart:io';
 
main(List<String> args) {
  print("main start");
  // getData();
  futureMethodData();
  print("main end");
}
 
// future 的實現方式
futureMethodData() {
  Future(() {
    // 這是第一次網絡請求
    sleep(Duration(seconds: 2));
    return "這是第一次網絡請求結果";
  }).then((value) {
    print(value);
    sleep(Duration(seconds: 2));
    return value + "這是第二次網絡請求結果";
  }).then((value) {
    print(value);
    sleep(Duration(seconds: 2));
    return value + "這是第三次網絡請求結果";
  }).then((value) {
    print(value);
  });
}
 
// async-await 的實現方式
getData() async {
  // 模擬三次網絡請求
  /**
   * 
   * main start
    main end
    args1helloworld
    args1helloworldhelloworld
    args1helloworldhelloworldhelloworld
   */
  var res1 = await getNetworkData("args1");
  print(res1);
  var res2 = await getNetworkData(res1);
  print(res2);
  var res3 = await getNetworkData(res2);
  print(res3);
}
 
getNetworkData(String args) {
  return Future(() {
    sleep(Duration(seconds: 2));
    return args + "helloworld";
  });
}

四 isolate

isolate  可以理解為dart 中的多線程,現在設備基本都是多核CPU,可以使用isolate 充分利用硬件資源。

isolate 之間是獨立的,資源不共享的。每一個isaolate 都有自己的事件循環以及隊列。

1 使用

import 'dart:io';
import 'dart:isolate';
 
main(List<String> args) async {
  print("main start");
  // 1
  ReceivePort receivePort = ReceivePort();
  // 2  spawn 返回的是future 所以要異步操作
  Isolate isolate =
      await Isolate.spawn<SendPort>(calculate, receivePort.sendPort);
 
  // 可以給創建的isolate 中發送消息
  receivePort.sendPort.send("這是從main isolate 發送的消息");
 
  //3 監聽創建的isolate的回調信息
  receivePort.listen((message) {
    print(message);
    // 收到結果 關閉 kill
    receivePort.close();
    isolate.kill();
  });
 
  print("main end");
}
 
calculate(SendPort port) {
  // 模擬耗時操作
  sleep(Duration(seconds: 2));
  // 回調信息
  port.send("這是從創建的isolate 發送的信息");
}

感謝各位的閱讀,以上就是“Dart中的異步編程怎么使用”的內容了,經過本文的學習后,相信大家對Dart中的異步編程怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广汉市| 郓城县| 宾阳县| 乌拉特后旗| 花垣县| 大英县| 永泰县| 车致| 鲜城| 兴宁市| 绥滨县| 定安县| 阜阳市| 钟祥市| 行唐县| 达拉特旗| 远安县| 黔西县| 哈密市| 龙泉市| 神农架林区| 镇坪县| 富民县| 聂荣县| 子长县| 云浮市| 夏津县| 凉城县| 腾冲县| 长泰县| 横山县| 汪清县| 马公市| 高青县| 大港区| 徐闻县| 临城县| 开封市| 巫溪县| 吴桥县| 南通市|