0

この質問はとても役に立ちます。複数の 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);
    }
}

問題は、プログラムがデータを表示するが、間違った順序で表示されることです。これは、前の非同期メソッドがまだ終了していない間に、次の非同期メソッドの実行が開始されたためです。

2 番目の呼び出しを onSuccess 内に配置することを提案する人もいますが、それは単純な 2 つの同期呼び出しのみです。しかし、私の場合、不明な数の Async 呼び出しをループする必要があります。

4

1 に答える 1

3

これは、これに似た質問です。すべての呼び出しは同時に実行されますが、応答時間は不明であり、順序は保証されません。したがって、解決策はほぼ同じで、コールバック内でループを呼び出します。コードは次のようになります。

@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);
}
于 2013-07-08T14:11:29.073 に答える