如何在 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 类型

如何在 gwt 中不分派异步实例的情况下进行服务器调用

在循环中创建多个循环的数据框以进行半正弦地理定位

如何在一个 foreach 循环中使用多个条件?

如何在单击多个项目时使用 jQuery 循环遍历数组?