这个问题非常有用。关于调用多个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个同步电话。但在我的情况下,我必须循环许多未知数量的异步调用,那我该怎么做呢?
答案 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);
}