Java的Deferred/Promise類庫:JDeferred

jopen 11年前發布 | 53K 次閱讀 JDeferred Java開發

JDeferred是一個 Java Deferred/Promise 類庫類似于 JQuery的Deferred對象。

靈感源于 JQueryAndroid 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!