如何在 GWTP 的循环中进行多个 AsyncCallback 调用?
Posted
技术标签:
【中文标题】如何在 GWTP 的循环中进行多个 AsyncCallback 调用?【英文标题】:How to make multiple AsyncCallback calls in a Loop in GWTP? 【发布时间】:2013-07-08 13:38:00 【问题描述】:这个问题很有用。有一些关于调用多个 AsyncCallback 的问题,但他们没有说明如何在循环中调用它们。
这是我的问题。我正在使用 Gwt 平台做一个项目。我有一个演示者 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】:这是一个类似于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);
【讨论】:
我改变了一点 int idx = -1;无论如何,非常感谢您的帮助。效果很好。 在响应中更改了它。 如果设置 idx = -1,则必须将 idx++ 更改为 ++idx。虽然在 onSuccess 块的末尾增加 idx 更清晰(以这种方式更改了代码)。 非常感谢,我改回0&把idx++放在if(idx以上是关于如何在 GWTP 的循环中进行多个 AsyncCallback 调用?的主要内容,如果未能解决你的问题,请参考以下文章
由于 CSS 延迟渲染,GWT/GWTP PopupDialog 并不总是居中
无法使用 guava-datatype 从 Spring 服务中使用 GWTP-Rest + jackson-guava 反序列化 guava 类型