Java的Deferred/Promise类库:JDeferred
jopen
11年前
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.open-open.com/lib/view/home/1384266764383