日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dart系列之:dart中的异步编程

發布時間:2024/2/28 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dart系列之:dart中的异步编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 為什么要用異步編程
  • 怎么使用
  • Future
  • 異步異常處理
  • 在同步函數中調用異步函數
  • 總結

簡介

熟悉javascript的朋友應該知道,在ES6中引入了await和async的語法,可以方便的進行異步編程,從而擺脫了回調地獄。dart作為一種新生的語言,沒有理由不繼承這種優秀的品質。很自然的,dart中也有await和async語言,一起來看看吧。

為什么要用異步編程

那么為什么要用異步編程呢? 只用同步不能夠解決嗎?

其實大多情況下同步已經夠用了,但是在下面的幾種情況下,同步的場景還是有缺陷的。

  • 需要花很長時間從網絡上下載數據的情況。
  • 讀取數據庫的耗時情況。
  • 從文件讀取數據的情況。
  • 總結而言,如果某些操作需要花費大量的時間,那么就可以用到異步編程了。

    怎么使用

    async是方法的描述符,如果要使用await,則必須配合async一起使用:

    Future<void> checkVersion() async {var version = await lookUpVersion();// Do something with version }

    注意,await后面一般接著的是Future對象。

    先看一個錯誤使用異步編程的例子:

    String createOrderMessage() {var order = fetchUserOrder();return 'Your order is: $order'; }Future<String> fetchUserOrder() =>Future.delayed(const Duration(seconds: 2),() => 'Order one!',);void main() {print(createOrderMessage()); }

    上面的代碼本意是打印出從數據庫耗時取出的數據,但是結果并不是想象的那樣,其原因就是fetchUserOrder方法是一個異步方法,所以不會立即返回,從而導致結果打印失敗。

    將上面的代碼用async改寫:

    Future<String> createOrderMessage() async {var order = await fetchUserOrder();return 'Your order is: $order'; }Future<String> fetchUserOrder() =>Future.delayed(const Duration(seconds: 2),() => 'Large Latte',);Future<void> main() async {print('Fetching user order...');print(await createOrderMessage()); }

    Future

    上面我們在使用async和await的過程中使用到了Future。在java中Future表示的是線程的執行結果。在dart中Future表示的是一個異步執行的結果。

    Future有兩種狀態:uncompleted 或者 completed。

    當最開始執行一個異步函數的時候,會返回一個未完成的Future。這個未完成的Future會等等異步執行的完成或者失敗。

    不管異步程序是成功還是失敗,最終都會返回一個完成狀態。

    async返回的Future可以接泛型,表示的時候返回的具體類型,比如Future 表示的是返回一個字符串,而 Future表示不返回任何值。

    下面是兩個不同返回的例子:

    Future<String> fetchUserOrder() {return Future.delayed(const Duration(seconds: 2), () => 'Large Latte'); }Future<void> fetchUserOrder() {return Future.delayed(const Duration(seconds: 2), () => print('Large Latte')); }

    下面是一個異常的例子:

    Future<void> fetchUserOrder() {return Future.delayed(const Duration(seconds: 2),() => throw Exception('Logout failed: user ID is invalid')); }

    異步異常處理

    在async的函數中,對await的異步方法中拋出的異常,可以直接是用try catch來進行異常的捕獲:

    try {print('Awaiting user order...');var order = await fetchUserOrder(); } catch (err) {print('Caught error: $err'); }

    在同步函數中調用異步函數

    上面介紹的fetchUserOrder()返回的是一個Future,表示的是一個異步執行的過程。

    那么如果是一個同步的方法,比如main()函數中,如何去調用異步方法,并且得到返回值呢?

    await肯定是不行的,因為await只能在async的方法中調用。這個時候就可以用到then語句:

    fetchUserOrder().then(order=>'do something');

    then語句會等待異步執行返回結果,然后對結果進行處理,實際上就等同于javascript中的回調。

    總結

    以上就是dart中async和await的用法。

    本文已收錄于 http://www.flydean.com/12-dart-async/

    最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

    歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!

    總結

    以上是生活随笔為你收集整理的dart系列之:dart中的异步编程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。