【Flutter 1-13】Flutter手把手教程Dart語言——異步、Future黎比、Stream超营、async、await詳解

異步

Dart 代碼庫中有大量返回FutureStream對象的函數(shù)阅虫,這些函數(shù)都是異步的演闭,它們會在耗時操作執(zhí)行完畢前直接返回而不會等待耗時操作執(zhí)行完畢。
asyncawait關鍵字用于實現(xiàn)異步編程颓帝,并且讓你的代碼看起來就像是同步的一樣米碰。

Future

可以通過下面兩種方式,獲得Future執(zhí)行完成的結果:

  • 使用asyncawait购城;
  • 使用Future API吕座;

使用asyncawait的代碼是異步的,但是看起來有點像同步代碼工猜。例如米诉,下面的代碼使用await等待異步函數(shù)的執(zhí)行結果菱蔬。

await lookUpVersion();

必須在帶有async關鍵字的異步函數(shù)中使用 await

Future checkVersion() async {
  var version = await lookUpVersion();
  // 使用 version 繼續(xù)處理邏輯
}

盡管異步函數(shù)可以處理耗時操作篷帅,但是它并不會等待這些耗時操作完成,異步函數(shù)執(zhí)行時會在其遇到第一個 await表達式的時候返回一個Future對象拴泌,然后等待await表達式執(zhí)行完畢后繼續(xù)執(zhí)行魏身。

使用trycatch以及finally來處理使用await導致的異常:

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

你可以在異步函數(shù)中多次使用await關鍵字蚪腐。例如箭昵,下面代碼中等待了三次函數(shù)結果:

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

await表達式的返回值通常是一個Future對象;
如果不是的話也會自動將其包裹在一個Future對象里回季。Future對象代表一個"承諾",await表達式會阻塞直到需要的對象返回家制。

如果在使用await時導致編譯錯誤正林,請確保await在一個異步函數(shù)中使用。例如颤殴,如果想在main()函數(shù)中使用await觅廓,那么main()函數(shù)就必須使用async關鍵字標識。

Future main() async {
  checkVersion();
  print('在 Main 函數(shù)中執(zhí)行:版本是 ${await lookUpVersion()}');
}

聲明異步函數(shù)

定義異步函數(shù)只需在普通方法上加上async關鍵字即可涵但。
將關鍵字async添加到函數(shù)并讓其返回一個Future 對象杈绸。假設有如下返回String對象的方法:

String lookUpVersion() => '1.0.0';

將其改為異步函數(shù),返回值是Future

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

注意矮瘟,函數(shù)體不需要使用Future API瞳脓。如有必要,Dart會創(chuàng)建Future對象澈侠。
如果函數(shù)沒有返回有效值劫侧,需要設置其返回類型為 Future<void>

Stream

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

Stream.fromFutures([
  // 1秒后返回結果
  Future.delayed(new Duration(seconds: 1), () {
    return "hello 1";
  }),
  // 拋出一個異常
  Future.delayed(new Duration(seconds: 2),(){
    throw AssertionError("Error");
  }),
  // 3秒后返回結果
  Future.delayed(new Duration(seconds: 3), () {
    return "hello 3";
  })
]).listen((data){
   print(data);
}, onError: (e){
   print(e.message);
},onDone: (){

});

上面的代碼依次會輸出:

hello 1
Error
hello 3
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呼猪,一起剝皮案震驚了整個濱河市画畅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宋距,老刑警劉巖轴踱,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谚赎,居然都是意外死亡淫僻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門壶唤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闸盔,你說我怎么就攤上這事。” “怎么了躲撰?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拢蛋。 經(jīng)常有香客問我坚踩,道長,這世上最難降的妖魔是什么瓤狐? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮础锐,結果婚禮上,老公的妹妹穿的比我還像新娘皆警。我一直安慰自己拦宣,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布信姓。 她就那樣靜靜地躺著鸵隧,像睡著了一般意推。 火紅的嫁衣襯著肌膚如雪豆瘫。 梳的紋絲不亂的頭發(fā)上菊值,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音腻窒,去河邊找鬼。 笑死儿子,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的柔逼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼羡铲,長吁一口氣:“原來是場噩夢啊……” “哼蜂桶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雷恃,失蹤者是張志新(化名)和其女友劉穎费坊,沒想到半個月后倒槐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體附井,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年把跨,在試婚紗的時候發(fā)現(xiàn)自己被綠了沼死。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片着逐。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡意蛀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出县钥,到底是詐尸還是另有隱情,我是刑警寧澤若贮,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锥咸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搏予。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一弧轧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧精绎,春花似錦、人聲如沸代乃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擂橘,卻和暖如春晌区,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背通贞。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昌罩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓银伟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彤避。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容