Dart學習-異步支持

Dart

Dart庫充滿了返回FutureStream對象的函數(shù)。這些函數(shù)是異步的:它們在設置一個可能耗時的操作(如I / O )后返回,而無需等待該操作完成。

asyncawait關鍵字支持異步編程,允許你編寫看起來類似于同步代碼的異步代碼。

處理Futures

當你需要一個完整Futures的結果時,你有兩個選擇:

  • 使用asyncawait
  • 使用Futures的API

使用asyncawait的代碼是異步的,但是看起來很像同步代碼。例如,以下代碼使用await來等待異步函數(shù)的結果:

await lookUpVersion();

使用await,代碼必須是在一個*異步函數(shù)(async function)里-標記為async的異步函數(shù):

Future checkVersion() async {
  var version = await lookUpVersion();
  // 用version變量做點什么
}

注意:雖然異步函數(shù)可能會執(zhí)行耗時的操作,但它不會等待這些操作。相反,異步函數(shù)只在遇到它的第一個await表達式之前執(zhí)行。然后,它返回一個Future的對象,只有在await表達式完成后,才恢復執(zhí)行。

使用try,catchfinally,最后在使用await的代碼去處理錯誤和清理后續(xù)邏輯

try {
  version = await lookUpVersion();
} catch (e) {
  // 無法查找到version做出反應
}

你可以在異步函數(shù)中多次使用await。例如,下面的代碼等待函數(shù)結果三次:

var entrypoint = await findEntrypoint();
var exitCode = await runExecutable(entrypoint, args);
await flushThenExit(exitCode);

await 表達式中,表達式的值通常是一個Future;如果不是,則該值將在Future中自動包裝。這個Future的對象表示承諾返回一個對象。await expression的值就是那返回的對象。await表達式使程序運行停止,直到對象可用!

如果當你使用await的時候,遇到到一個編譯時錯誤。此時請確保await是否處于異步函數(shù)中。例如,在app的main()函數(shù)中使用await,則main()主主體必須標志為async即異步

Future main() async {
  checkVersion();
  print('In main: version is ${await lookUpVersion()}');
}

聲明異步函數(shù)

當一個函數(shù)主體被async修飾符標志,那么這個函數(shù)就是一個異步函數(shù)

async關鍵字添加到函數(shù)中會使它返回Future。例如,看下這個同步函數(shù),它返回一個字符串:

String lookUpVersion() => '1.0.0';

請注意,函數(shù)的主體不需要使用Future的API。如果需要,dart會創(chuàng)建Future的對象。

如果你的函數(shù)沒有任何有用的值,請將其返回類型設為Future<void>

處理流

當你需要從流中獲取值時,有兩個選項:

  • 使用async和異步循環(huán)(await for)
  • 使用流API

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

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

await for (varOrType identifier in expression) {
  //每次流發(fā)出值時執(zhí)行
}

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

  1. 等到流發(fā)出一個值。
  2. 執(zhí)行for循環(huán)的主體,將變量設置為該發(fā)出的值。
  3. 重復第1步和第2步,直至流關閉。

若要停止偵聽流,可以使用breakreturn語句,該語句脫離for循環(huán)并取消訂閱流。

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

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

有關異步編程的更多信息,一般來說,請參見庫教程的dart:async
。另請參見文章Dart Language Asynchrony Support: Phase 1Dart Language Asynchrony Support: Phase 2,以及 Dart language specification

PS:本文整理自官方文檔,若有發(fā)現(xiàn)問題請致郵 caoyanglee92@gmail.com

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 目錄 參考資料 語言特性 關鍵字 變量與常量 數(shù)據(jù)類型 運算符 operators 控制流程語句 異常 Excep...
    GuoDongW閱讀 185,917評論 22 341
  • 此文章是v1.0+時編寫,年代久遠,小心有毒,謹慎食用?。?! 一些重要概念 所有的東西都是對象,所有的對象都是類的...
    soojade閱讀 10,222評論 2 27
  • Dart API 學習記錄(一) http://www.itdecent.cn/p/388d986c0f48 D...
    you的日常閱讀 9,954評論 1 14
  • 我正在參加怦然心動·邂逅你的11封情書——1111情書交友創(chuàng)作大賽,快來給我寫情書吧。(加粗復制本句到文首,非單身...
    向南潯枝柳閱讀 1,030評論 27 13
  • 從家走時又落了大雨,奶奶正在燒午飯,她說為什么每次你出門都要下雨,我笑笑不說話,也許老家留戀我吧。爸媽不在家,奶奶...
    鶯與舟閱讀 310評論 0 0

友情鏈接更多精彩內(nèi)容