Flutter 異步編程一(Future隘马、async太防、await、completer)

三钝鸽、借鑒文章地址

這篇文章講解Futureasync庞钢、await拔恰、completer的使用。

Future最簡單用法展示:

  void getData<T>() async{
    Future zyn = Future(() => print('運行的Future'))
                  .then((_) => print('運行的Future第一個then'))
                  .then((_) => print('運行的Future第一個then'))
                  .whenComplete(()=>print('運行whenComplete'))
                  .catchError((_)=>print('運行catchError'));
    print(zyn);
  }

寫過react native的童鞋都知道基括,在rn中有個promise,目的是解決回調(diào)地獄(callBack無限嵌套)的出現(xiàn)仁连,而且上面的代碼和promise的使用相同。
1阱穗、then的鏈?zhǔn)竭B接避免了回調(diào)地獄的出現(xiàn)
2饭冬、whenCompletecatchError類似iOS中的try揪阶、catch昌抠。

Future的其他用法展示:

用法一:直接后面加需要執(zhí)行的代碼
Future(() => print('立刻在Event queue中運行'));
用法二:Future.delayed
Future.delayed(const Duration(seconds:1), () => print('1秒后在Event queue中運行'));
用法三:Future. microtask
Future.microtask(() => print('在Microtask queue里運行的Future'));

前兩個很好理解,第一個為立刻執(zhí)行鲁僚、第二個為delay一秒后執(zhí)行炊苫。那么Future.microtask是什么用法呢?
要理解這個冰沙,需要知道dart的Event Loop侨艾。

dart的Event Loop

Dart的事件循環(huán)如下圖所示。和JavaScript的基本一樣拓挥。循環(huán)中有兩個隊列唠梨。一個是微任務(wù)隊列(MicroTask queue),一個是事件隊列(Event queue)侥啤。

  • 事件隊列包含外部事件当叭,例如I/O, Timer繪制事件等等盖灸。
  • 微任務(wù)隊列則包含有Dart內(nèi)部的微任務(wù)蚁鳖,主要是通過scheduleMicrotask來調(diào)度。
image.png

Dart的事件循環(huán)的運行遵循以下規(guī)則:

  • 首先處理所有微任務(wù)隊列里的微任務(wù)赁炎。
  • 處理完所有微任務(wù)以后醉箕。從事件隊列里取1個事件進(jìn)行處理。
  • 回到微任務(wù)隊列繼續(xù)循環(huán)。

注意第一步里的所有讥裤,也就是說在處理事件隊列之前放棒,Dart要先把所有的微任務(wù)處理完。如果某一時刻微任務(wù)隊列里有8個微任務(wù)坞琴,事件隊列有2個事件哨查,Dart也會先把這8個微任務(wù)全部處理完再從事件隊列中取出1個事件處理逗抑,之后又會回到微任務(wù)隊列去看有沒有未執(zhí)行的微任務(wù)剧辐。

總而言之,就是對微任務(wù)隊列是一次性全部處理邮府,對于事件隊列是一次只處理一個荧关。

那么上面Future. microtask的使用也就明白了。

Completer

不多BB褂傀,用法直接上代碼忍啤。

  void getData<T>() async{
    var completer = Completer();
    Future zyn = completer.future;
    zyn.then((_) => print('運行的Future第一個then'))
                  .then((_) => print('運行的Future第二個then'))
                  .whenComplete(()=>print('運行whenComplete'))
                  .catchError((_)=>print('運行catchError'));
    print('先干點別的');
    completer.complete();
  }

打印結(jié)果如下:

flutter: 先干點別的
flutter: 運行的Future第一個then
flutter: 運行的Future第二個then
flutter: 運行whenComplete

結(jié)論:CompleterFuture的控制權(quán)在我們自己手里,我們來控制Future的調(diào)用仙辟。

雖然Future的出現(xiàn)解決了回調(diào)地獄的出現(xiàn)同波,但是依然會出現(xiàn)Future的嵌套,比如兩個異步叠国,第二個要依賴第一個結(jié)果未檩,那是不是就要在第一個Futurethen或者whenComplete中再初始化一個Future
async粟焊、await的出現(xiàn)就是為了解決這個問題冤狡,讓你的異步代碼,寫出同步的感覺项棠。

async悲雳、await

代碼奉上,現(xiàn)行感受一下:

foo() async {
  print('foo E');
  String value = await bar();
  print('foo X $value');
}

bar() async {
  print("bar E");
  return "hello";
}

main() {
  print('main E');
  foo();
  print("main X");
}

函數(shù)foo被關(guān)鍵字async修飾香追,其內(nèi)部的有3行代碼合瓢,看起來和普通的函數(shù)沒什么兩樣。但是在第2行等號右側(cè)有個await關(guān)鍵字透典,await的出現(xiàn)讓看似會同步執(zhí)行的代碼裂變?yōu)閮刹糠滞崃帷H缦聢D所示:

image.png

綠框里面的代碼會在foo函數(shù)被調(diào)用的時候同步執(zhí)行,在遇到await的時候掷匠,會馬上返回一個Future滥崩,剩下的紅框里面的代碼以then的方式鏈入這個Future被異步調(diào)度執(zhí)行。
所以結(jié)果應(yīng)該是:

main E
foo E
bar E
main X
foo X Hello

到這里就講完啦讹语,接下來留一個題目钙皮,請大家留言,寫下自己的答案吧:

Screen Shot 2019-09-09 at 20.33.49.png

Flutter 異步編程二(isolate、compute)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末短条,一起剝皮案震驚了整個濱河市导匣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茸时,老刑警劉巖贡定,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異可都,居然都是意外死亡缓待,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門渠牲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旋炒,“玉大人,你說我怎么就攤上這事签杈√闭颍” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵答姥,是天一觀的道長铣除。 經(jīng)常有香客問我,道長鹦付,這世上最難降的妖魔是什么尚粘? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮睁壁,結(jié)果婚禮上背苦,老公的妹妹穿的比我還像新娘。我一直安慰自己潘明,他們只是感情好始藕,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布匾嘱。 她就那樣靜靜地躺著厂置,像睡著了一般泰涂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遂填,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天铲觉,我揣著相機(jī)與錄音,去河邊找鬼吓坚。 笑死撵幽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的礁击。 我是一名探鬼主播盐杂,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼逗载,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了链烈?” 一聲冷哼從身側(cè)響起厉斟,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎强衡,沒想到半個月后擦秽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡漩勤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年感挥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锯七。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡链快,死狀恐怖誉己,靈堂內(nèi)的尸體忽然破棺而出眉尸,到底是詐尸還是另有隱情,我是刑警寧澤巨双,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布噪猾,位于F島的核電站,受9級特大地震影響筑累,放射性物質(zhì)發(fā)生泄漏袱蜡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一慢宗、第九天 我趴在偏房一處隱蔽的房頂上張望坪蚁。 院中可真熱鬧,春花似錦镜沽、人聲如沸敏晤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘴脾。三九已至,卻和暖如春蔬墩,著一層夾襖步出監(jiān)牢的瞬間译打,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工拇颅, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留奏司,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓樟插,卻偏偏與公主長得像韵洋,于是被迫代替她去往敵國和親哥谷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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