如何在GWTP中的循环中进行多个AsyncCallback调用?

时间:2013-07-08 13:38:00

标签: gwt asynchronous gwt-rpc gwtp

这个问题非常有用。关于调用多个AsyncCallback有一些问题,但他们没有告诉如何在循环中调用它们。

这是我的问题。我正在使用Gwt-platform做一个项目。我有一个演示者TestPresenter.java,它有以下代码:

@Inject
DispatchAsync dispatchAsync;

private AsyncCallback<GetDataResult> getDataCallback = new AsyncCallback<GetDataResult>() {

    @Override
    public void onFailure(Throwable caught) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onSuccess(GetDataResult result) {
       // do Something o show the gui here
    }
};

public void load_All_Gui_At_Once() {
    for(int i=0; i<5; i++) {
        GetData getDataAction=new GetData(i);
        dispatchAsync.execute(getDataAction, getDataCallback);
    }
}

问题是程序显示数据但显示顺序错误。这是下一个Async方法开始运行的原因,而前一个方法还没有完成。

有人建议我把第二个电话放在onSuccess上,但这只适用于简单的2个同步电话。但在我的情况下,我必须循环许多未知数量的异步调用,那我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

这是一个类似于this one的问题。您的所有呼叫都在同一时刻执行,但响应时间未知,并且无法保证订单。所以解决方案几乎相同,在回调中调用循环。您的代码应如下所示:

@Inject
DispatchAsync dispatchAsync;

private AsyncCallback<GetDataResult> getDataCallback = new AsyncCallback<GetDataResult>() {
  int idx = 0;

  @Override
  public void onFailure(Throwable caught) {
    // TODO Auto-generated method stub
  }

  @Override
  public void onSuccess(GetDataResult result) {
    if (result != null) {
      // do Something or show the gui here
    }
    if (idx < 5) {
      GetData getDataAction = new GetData(idx);
      dispatchAsync.execute(getDataAction, getDataCallback);
    }
    idx ++;
  }
};

public void load_All_Gui_At_Once(){
  // Start the loop, calling onSuccess the first time
  getDataCallback.onSuccess(null);
}