Clean way in GWT/Java to wait for multiple asynchronous events to finish

use*_*478 39 java gwt google-ajax-api

What is the best way to wait for multiple asynchronous callback functions to finish in Java before continuing. Specifically I'm using GWT with AsyncCallback, but I think this is a generic problem. Here's what I have now, but surely there is cleaner way...

    AjaxLoader.loadApi("books", "0", new Runnable(){
        public void run() {
            bookAPIAvailable = true;
            ready();
        }}, null);
    AjaxLoader.loadApi("search", "1", new Runnable(){
        public void run() {
            searchAPIAvailable = true;
            ready();
        }}, null);


    loginService.login(GWT.getHostPageBaseURL(), new AsyncCallback<LoginInfo>() {
        public void onSuccess(LoginInfo result) {
            appLoaded  = true;
            ready();
        }
    });

private void ready() {
    if(bookAPIAvailable && searchAPIAvailable && appLoaded) {
                // Everything loaded
    }
}
Run Code Online (Sandbox Code Playgroud)

thr*_*rop 41

我写了两个类来解决我的项目中的这个问题.基本上,每个单独的回调都向父母注册.父级等待每个子回调完成,然后触发它自己的handleSuccess().

客户端代码如下所示:

public void someGwtClientSideMethod() {
    SomeServiceAsync someService = GWT.create(SomeService.class);
    ParallelCallback fooCallback = new ParallelCallback();
    ParallelCallback barCallback = new ParallelCallback();
    ParentCallback parent = new ParentCallback(fooCallback, barCallback) {
        public void handleSuccess() {
            doSomething(getCallbackData(1), getCallbackData(2));
        }
    };
    someService.foo(fooCallback);
    someService.bar(barCallback);
}
Run Code Online (Sandbox Code Playgroud)

我在这里写了一篇文章解释它: GWT中的并行异步调用.这两个类的实现是从该帖子链接的(抱歉,这里不能给出链接,因为我是一个新手用户 - 没有足够的业力来包含多个链接!).

  • +1你需要业力,我给你一个,在这里你免费去! (4认同)

Jas*_*all 5

就像@Epsen所说,Future可能就是你想要的.不幸的是,我不相信Future它们与GWT兼容.在GWT-异步未来项目索赔将这一功能GWT,但我从来没有尝试过.这可能值得一看.


Sri*_*nan 2

首先也是最重要的 - 永远不要陷入这种情况。重新设计您的 RPC 服务,使每个用户流/屏幕最多需要一次 RPC 调用才能工作。在这种情况下,您对服务器进行了三个调用,这只是浪费带宽。延迟只会杀死你的应用程序。

如果您不能并且确实需要破解,请使用计时器定期轮询所有数据是否已下载。您上面粘贴的代码假设login() 方法将是最后完成的 - 这是错误的。它可能是第一个完成的,然后你的应用程序将处于不确定状态 - 这非常难以调试。

  • 你能解释一下为什么你认为这段代码假设login()方法将是最后完成的吗?请注意,ready() 方法将被调用三次——仅在最后一次调用时评估 true。我已经成功地使用了这段代码,我不认为存在排序问题,但如果我错了,请纠正我...... (2认同)