Dart中的Future及其then、catchError方法

在學習Flutter的過程中,看到網(wǎng)上很多人使用Future的時候會使用到future.then()這種操作,一直有些困惑,從而自己在寫Flutter的過程中都是盡可能的避免使用到then,但是感覺不能夠繼續(xù)躲避了,決定學習一波。

Future的API

官方對于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的完成

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容