最近,我发现我真的喜欢jQuery.Deferred()以及它为您提供处理异步流控制(Promises)的功能。我认为我最喜欢的东西是Ajax请求(.done()
和.fail()
)的回调挂钩以及.resolve()
和.reject()
承诺的能力。我可能在某个时候需要这个功能用于GWT项目,我想知道,该生态系统中有什么类似的东西吗?
答案 0 :(得分:8)
gwtquery 1.4.0以与jquery相同的方式实现Deferred:
最近,我们在GWT.create Conference中发布了gwtquery演示文稿,介绍了承诺等新内容,您可以查看slides(按箭头键在幻灯片之间移动)。
ajax()
现在返回Promise
,您也可以获取与任何gQuery对象的队列关联的promise()
。此外,您可以在任何gwt回调中创建Deferred()
或使用帮助函数来处理RequestBuider,RPC,RF。
从junit测试中获取,这里有一部分代码可以在代码中使用它们:
public void testDeferredAjaxWhenDone() {
String url = "https://www.googleapis.com/blogger/v2/blogs/user_id/posts/post_id?callback=?&key=NO-KEY";
delayTestFinish(5000);
GQuery.when(Ajax.getJSONP(url))
.done(new Function() {
public void f() {
Properties p = arguments(0);
assertEquals(400, p.getProperties("error").getInt("code"));
finishTest();
}
});
}
public void testDeferredAjaxWhenFail() {
String url1 = "https://www.googleapis.com/blogger/v2/blogs/user_id/posts/post_id?callback=?&key=NO-KEY";
String url2 = "https://localhost:4569/foo";
delayTestFinish(5000);
GQuery.when(
Ajax.getJSONP(url1),
Ajax.getJSONP(url2))
.done(new Function() {
public void f() {
fail();
}
})
.fail(new Function(){
public void f() {
finishTest();
}
});
}
int progress = 0;
public void testPromiseFunction() {
delayTestFinish(3000);
final Promise doSomething = new PromiseFunction() {
@Override
public void f(final Deferred dfd) {
new Timer() {
int count = 0;
public void run() {
dfd.notify(count ++);
if (count > 3) {
cancel();
dfd.resolve("done");
}
}
}.scheduleRepeating(50);
}
};
doSomething.progress(new Function() {
public void f() {
progress = arguments(0);
}
}).done(new Function() {
public void f() {
assertEquals(3, progress);
assertEquals(Promise.RESOLVED, doSomething.state());
finishTest();
}
});
}
答案 1 :(得分:6)
我刚刚开源Promises for Java受到CommonJS Promises / A +提案和Dart's Futures的启发。
我的目标是尽快添加GWT支持(Promises
和FulfillablePromise
的GWT兼容性,以及至少GWT-RPC的帮助程序。