1 .vertx中的Future與java原生中不同,二者都有封裝結果的功能,但是vertx中為了避免await阻塞event loop線程,導致不能及時響應的問題.通過在Future中定義回調Handler來解決這個問題.
demo1:
demo1解釋:
1.定義壹個結果類型為String的Future.
2.為這個Future設置回調.
3.調用異步方法,將這個Future作為參數傳入
4.complete()將調用結果封裝進Future,並將Future的狀態置為completed.返回.
5.最後回調函數執行,處理調用結果.
需要理清的是,
Future<T> 中的T代表的是返回的結果類型.
Handler<AsyncResult<T>> 是對調用結果的處理函數.
2 .理解compose,compose是為了應對回調地獄采用的鏈式寫法.
compose的第壹種寫法:
傳入參數為
1.調用此compose方法的future的handler,
2.下壹個future
處理思路:
1.執行compose調用future的回調處理
2.如果當前future的回調處理中出錯,那麽將下壹個future置為失敗,
3.未出錯則直接將下壹個future返回.
demo2:
demo2解釋:
1.定義2個future
2.第4行模擬第1個異步調用完畢,f1得到結果,狀態completed.
3.f1發起compose,參數1為f1的handler,參數2為下壹個future f2
4.註意,在f1的handler中,模擬第2個異步調用完畢,f2狀態轉為completed,從而觸發f2的handler.
compose的第2種寫法
處理思路:
1.傳入參數類型Function<T, Future<U>>,說明傳入的是壹個轉換函數,此函數將future中的調用結果T轉換為鏈中的下壹個future.
2.如果調用是成功的,那麽將調用結果作為參數傳入這個function執行,就是這句"apply = mapper.apply(ar.result());",返回結果為Future<U>.
3.由於事先需要對調用結果ar是否成功判斷,所以外面再套了個Future<U> ret.
4.將ret返回.
這個封裝蠻有意思,在compose方法中設置調用者future的handler,在handler中將future中的結果ar傳遞給compose參數(function),然後執行function,最後將function返回的future用compose內部生成的future封裝下返回.
demo3:
雖然api封裝復雜了些,但是使用過程比第1種寫法更加簡單了.也容易理解.