Java的Deferred/Promise類庫:JDeferred
JDeferred是一個 Java Deferred/Promise 類庫類似于 JQuery的Deferred對象。
靈感源于 JQuery和 Android Deferred Object。
特性:
- Deferred object and Promise
- Promise callbacks
.then(…)
.done(…)
.fail(…)
.progress(…)
.always(…)
- Multiple promises
.when(p1, p2, p3, …).then(…)
- Callable and Runnable wrappers
.when(new Runnable() {…})
- Uses Executor Service
- Java Generics support
Deferred<Integer, Exception, Double> deferred;
deferred.resolve(10);
deferred.reject(new Exception());
deferred.progress(0.80);
- Android Support
- Java 8 Lambda friendly
- Yes it's on Maven Central Repository!
Deferred deferred = new DeferredObject(); Promise promise = deferred.promise(); promise.done(new DoneCallback() { public void onDone(Object result) { ... } }).fail(new FailCallback() { public void onFail(Object rejection) { ... } }).progress(new ProgressCallback() { public void onProgress(Object progress) { ... } }).always(new AlwaysCallback() { public void onAlways(State state, Object result, Object rejection) { ... } });
jQuer 1.5版本引入Deferred功能, 為處理事件回調提供了更加強大而靈活的編程模型.
什么Deferred
根據jQuery的官方api文檔的描述: jQuery.Deferred()是可鏈式調用的工具對象, 它能夠注冊回調函數到一個隊列中, 依次調用該隊列中的回調函數,并且能夠將調鏈中上一個函數(同步或者異步)的返回狀態傳遞到下一個回調函數中.
jQuery.Deferred()背后的設計理念來自CommonJS Promises/A , jQuery.Deferred()基于這個理念實現,但并沒有完全遵循其設計。其它語言或者框架,例如python和dojo中都有類似的實現。
下面簡單介紹一下 “Promises”的設計思想,目的在于下文介紹jQuery.Deferred()的API時,讓大家能有一個理論上的了解。
Promise, 中文可以理解為愿望,代表單個操作完成的最終結果。一個Promise擁有三種狀態:分別是unfulfilled(未滿足的)、fulfilled(滿足的)、failed(失敗的),fulfilled狀態和failed狀態都可以被監聽。一個愿望可以從未滿足狀態變為滿足或者失敗狀態,一旦一個愿望處于滿足或者失敗狀態,其狀態將不可再變化。這種“不可改變”的特性對于一個Promise來說非常的重要,它可以避免Promise的狀態監聽器修改一個Promise的狀態導致別的監聽器的行為異常。例如:一個監聽fulfilled狀態的監聽器把Promise的狀態修改為failed,那么將觸發failed狀態的監聽器,而如果一個failed狀態監聽器又把Promise的狀態設置為fulfilled,那么又將觸發fulfilled狀態的監聽器,這樣將導致死循環。另外一種理解Promise這種特性的方式是把Promise看成是javascript中的primative類型的變量,這種變量可以被傳入被調用的函數中,但是不可以被調用函數所改變。
每一個Promise對象都有一個方法:then(fulfilledHandler, errorHandler, progressHandler),用于監聽一個Promise的不同狀態。fulfilledHandler用于監聽fulfilled事件,errorHandler用于監聽failed事件,progressHandler用于監聽progress事件。一個Promise不強制實現progress狀態的事件監聽(jQuery的Deferred就是一個Promise的實現,但沒有實現對progress狀態事件的處理)。
關于jQuery的Deferred 詳見:http://zsuczw.iteye.com/blog/1121129
項目主頁:http://www.baiduhome.net/lib/view/home/1384266764383
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!