了解一下dart中的Future

????在flutter開發(fā)中我們大量使用Future镊辕,特別是異步編程中吉拳,如果一個(gè)Fuction被async修飾暮芭,則該Fuction將會(huì)返回一個(gè)Future想鹰,F(xiàn)uture的運(yùn)行值即該Fuction的返回值。在調(diào)用這種的方法的時(shí)候可以以同步方式調(diào)用(調(diào)用的時(shí)候使用await關(guān)鍵字修飾)吁系,也可以異步調(diào)用(Future.then的方式)的方式進(jìn)行調(diào)用德召,竊以為Future的引入將面向函數(shù)編程的理念提高了很多個(gè)量級(jí),那么我們就來了解一下Future的一些常用構(gòu)造方法以及用法吧:
????Future表示延遲運(yùn)行的對(duì)象汽纤,用來表示一個(gè)潛在的值返回或錯(cuò)誤返回上岗,這個(gè)返回值將在未來的某個(gè)時(shí)刻才可用。Future的調(diào)用者可以注冊(cè)回調(diào)蕴坪,一旦返回值或錯(cuò)誤可用肴掷,就可以通過回調(diào)函數(shù)對(duì)其進(jìn)行處理。
????Future可以通過兩種方式完成:一種是有值的(“未來成功”)背传,另一種是有錯(cuò)誤的(“未來失敗”)呆瞻。調(diào)用者可以為每種情況設(shè)置回調(diào)函數(shù)。
????在某些情況下径玖,我們可以將一個(gè)Future緊接著另一個(gè)Future完成痴脾,就是說Future的調(diào)用可以使成串的。但是當(dāng)future在完成時(shí)出現(xiàn)錯(cuò)誤梳星,而且它沒有后續(xù)與之串起來的Future赞赖,則這個(gè)錯(cuò)誤消息將會(huì)被轉(zhuǎn)發(fā)給全局錯(cuò)誤處理程序。這種機(jī)制確保了錯(cuò)誤不會(huì)被自動(dòng)刪除冤灾,但是前域,這也意味著開發(fā)者應(yīng)該盡早注冊(cè)錯(cuò)誤處理函數(shù)以便Future一旦返回error,error處理程序就會(huì)立進(jìn)行處理韵吨。
????在注冊(cè)回調(diào)函數(shù)時(shí)匿垄,通常會(huì)同時(shí)設(shè)置正常返回值的處理函數(shù)以及catchError處理函數(shù),每一種函數(shù)都將把它們處理結(jié)果轉(zhuǎn)發(fā)給它們的下一個(gè)Future,并進(jìn)一步處理返回值或error結(jié)果年堆,使用串聯(lián)的Future通常會(huì)使代碼更容易理解;當(dāng)然我們還可以將異步代碼寫成是同步代碼的代碼的方式(通過async和await關(guān)鍵字)盏浇,這樣可以使代碼的結(jié)構(gòu)變得很簡單变丧。Future葉可能永遠(yuǎn)不會(huì)執(zhí)行結(jié)束,在這種情況下绢掰,回調(diào)函數(shù)將不會(huì)被執(zhí)行痒蓬。Future的構(gòu)造方法說明:

1、Future(FutureOr<T> computation())

  factory Future(FutureOr<T> computation()) {
    _Future<T> result = new _Future<T>();
    Timer.run(() {
      try {
        result._complete(computation());
      } catch (e, s) {
        _completeWithErrorCallback(result, e, s);
      }
    });
    return result;
  }

創(chuàng)建包含使用Timer.run異步調(diào)用計(jì)算結(jié)果的Future滴劲。如果執(zhí)行過程拋出異常攻晒,則future將返回錯(cuò)誤。如果返回的值本身也是一個(gè)Future班挖,則創(chuàng)建的Future的完成將后繼續(xù)等待返回的Future執(zhí)行完成鲁捏,然后將返回相同類型的結(jié)果。如果返回一個(gè)非未來值萧芙,則返回的Future將使用該值作為返回值给梅。

2、Future.delayed(Duration duration, [FutureOr<T> computation()])

  factory Future.delayed(Duration duration, [FutureOr<T> computation()]) {
    _Future<T> result = new _Future<T>();
    new Timer(duration, () {
      if (computation == null) {
        result._complete(null);
      } else {
        try {
          result._complete(computation());
        } catch (e, s) {
          _completeWithErrorCallback(result, e, s);
        }
      }
    });
    return result;
  }

????創(chuàng)建在延遲一定時(shí)間后運(yùn)行的Future双揪。computation將在給定的時(shí)間后執(zhí)行动羽。如果computation返回的又是一個(gè)Future,則此構(gòu)造函數(shù)返回的Future將與該Future的值或錯(cuò)誤一起完成后返回渔期。如果持續(xù)時(shí)間為0或更少运吓,則在所有微任務(wù)運(yùn)行之后運(yùn)行,它不會(huì)在下一個(gè)事件循環(huán)迭代中運(yùn)行疯趟。如果省略computation拘哨,F(xiàn)uture將最終使用null值返回。如果調(diào)用computation拋出異常信峻,則創(chuàng)建的Futuren將返回錯(cuò)誤宅静。

3、Future.microtask(FutureOr<T> computation())

factory Future.microtask(FutureOr<T> computation()) {
  _Future<T> result = new _Future<T>();
  scheduleMicrotask(() {
    try {
      result._complete(computation());
    } catch (e, s) {
      _completeWithErrorCallback(result, e, s);
    }
  });
  return result;
}

????創(chuàng)建包含使用scheduleMicrotask異步調(diào)用計(jì)算的結(jié)果的Future站欺。如果執(zhí)行computation拋出異常姨夹,則返回的future將返回錯(cuò)誤。如果computation本身又返回一個(gè)Future矾策,則創(chuàng)建的Future的完成后將繼續(xù)等待返回的Future完成磷账,然后將使用相同類型的結(jié)果進(jìn)行返回。如果computation返回一個(gè)非future值贾虽,則返回的future將使用該值返回逃糟。

4、 Future.value([FutureOr<T> value])

  factory Future.value([FutureOr<T> value]) {
    return new _Future<T>.immediate(value);
  }

????創(chuàng)建一個(gè)有值返回的Future。如果返回值又是Future绰咽,則創(chuàng)建的Future將等待返回的future完成后將相同類型的結(jié)果返回菇肃。因?yàn)橐粋€(gè)value future可以在錯(cuò)誤的情況下返回,所以future.value創(chuàng)建的future也可以返回取募。如果value不是Future琐谤,則創(chuàng)建的Future將使用value值返回,相當(dāng)于new Future<T>.sync(()=>value)玩敏。

5斗忌、Future.sync(FutureOr<T> computation())

factory Future.sync(FutureOr<T> computation()) {
  try {
    var result = computation();
    if (result is Future<T>) {
      return result;
    } else {
      return new _Future<T>.value(result);
    }
  } catch (error, stackTrace) {
    var future = new _Future<T>();
    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
    if (replacement != null) {
      future._asyncCompleteError(
          _nonNullError(replacement.error), replacement.stackTrace);
    } else {
      future._asyncCompleteError(error, stackTrace);
    }
    return future;
  }
}

????返回包含立即調(diào)用計(jì)算結(jié)果的future。如果computation拋出異常旺聚,則返回的future將返回錯(cuò)誤织阳。如果computation返回Future<T>,則返回該Future砰粹。如果computation返回一個(gè)非future值唧躲,則返回已完成運(yùn)行的future。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碱璃,一起剝皮案震驚了整個(gè)濱河市惊窖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厘贼,老刑警劉巖界酒,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘴秸,居然都是意外死亡毁欣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門岳掐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凭疮,“玉大人,你說我怎么就攤上這事串述≈唇猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵纲酗,是天一觀的道長衰腌。 經(jīng)常有香客問我,道長觅赊,這世上最難降的妖魔是什么右蕊? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮吮螺,結(jié)果婚禮上饶囚,老公的妹妹穿的比我還像新娘帕翻。我一直安慰自己,他們只是感情好萝风,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布嘀掸。 她就那樣靜靜地躺著,像睡著了一般规惰。 火紅的嫁衣襯著肌膚如雪睬塌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天卿拴,我揣著相機(jī)與錄音,去河邊找鬼梨与。 笑死堕花,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥鞋。 我是一名探鬼主播缘挽,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼呻粹!你這毒婦竟也來了壕曼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤等浊,失蹤者是張志新(化名)和其女友劉穎腮郊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筹燕,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧飞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撒踪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片过咬。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖制妄,靈堂內(nèi)的尸體忽然破棺而出掸绞,到底是詐尸還是另有隱情,我是刑警寧澤耕捞,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布衔掸,位于F島的核電站,受9級(jí)特大地震影響俺抽,放射性物質(zhì)發(fā)生泄漏具篇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一凌埂、第九天 我趴在偏房一處隱蔽的房頂上張望驱显。 院中可真熱鬧,春花似錦、人聲如沸埃疫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栓霜。三九已至翠桦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胳蛮,已是汗流浹背销凑。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仅炊,地道東北人斗幼。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像抚垄,于是被迫代替她去往敵國和親蜕窿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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