Java的Deferred/Promise类库:JDeferred

jopen 10年前

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.open-open.com/lib/view/home/1384266764383