????在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。