在學習Flutter的過程中,看到網(wǎng)上很多人使用Future的時候會使用到future.then()這種操作,一直有些困惑,從而自己在寫Flutter的過程中都是盡可能的避免使用到then,但是感覺不能夠繼續(xù)躲避了,決定學習一波。
官方對于Future的描述是:一個潛藏的value或者error,在未來的某一刻是可用的。
之前的文章中講到Future及其搭檔await和async的搭配使用實現(xiàn)等待耗時操作,那么這里的then回調(diào)就是回歸Future的本意:在未來的某一時刻可用
then回調(diào)
Future<R> then <R>(
FutureOr<R> onValue(
T value
), {
Function onError
})
可見then的參數(shù)有兩個,第一個是一個Callback,第二個是一個可選的命名Function參數(shù)onError。
- Callback:上面說到Future是一個潛藏的value或者error,當Future成功完成的時候則會執(zhí)行onValue這個Callback
- Function onError:而這個函數(shù)的執(zhí)行條件就是Future失敗的時候
補充:then方法的返回類型還是一個Future(稱他為f2,調(diào)用then的為f1),這個返回的f2的value或者error在最初的時候與f1的相同;但是Callback的作用就是處理f1中的value,而onError的作用就是處理f1中的error;所以如果Callback或者onError也是返回了一個Future f3,那么then方法返回的f2將會被f3所覆蓋
onError這個Function的參數(shù)也是兩個:第一個是Exception,第二個是可選參數(shù)StackTrace。
catchError
catchError方法和then方法是同一級別的,catchError是最后的保障,catchError與then方法的onError參數(shù)不同的是,catchError可以處理之前所有處理過程中產(chǎn)生的error,而onError只能夠處理調(diào)用then的Future對象的異常
future1.then((value)=>useValue(value), onError: (e){}).then().catchError();
上面的onError只能夠處理future1過程中產(chǎn)生的異常,而catchError則可以捕獲future1過程以及userValue可能產(chǎn)生的異常。
catchError方法的參數(shù)為最常用的是第一個Function onError參數(shù),同then的第二個參數(shù)
總結(jié):future的then回調(diào)類似于一種觀察這模式一樣,可見使用await的方法并不適合添加then方法,因為then主要目的是在future完成的時候再來處理value從而避免阻塞,而await直接暴力的阻塞當前線程來等待future的完成