2013-07-08 5 views
0

이 질문은 매우 유용합니다. 여러 개의 AsyncCallback을 호출하는 것에 대해 몇 가지 질문이 있지만 루프에서 호출하는 방법을 알려주지 않았습니다.GWTP의 루프에서 여러 개의 AsyncCallback 호출을 수행하는 방법은 무엇입니까?

여기 내 문제입니다. 나는 Gwt-platform을 사용하여 프로젝트를하고있다.

@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); 
    } 
} 

문제는 프로그램이 데이터를 표시하지만 잘못된 순서로 나타났다이다 : 나는이 코드를 가지고 발표자 TestPresenter.java을 얻었다. 이전 Async 메서드가 아직 완료되지 않은 상태에서 다음 Async 메서드가 실행되기 시작했기 때문입니다.

일부 사람들은 제 2 전화를 온 액세스에 배치 할 것을 제안했지만, 이는 단순한 2 동기화 호출에만 해당됩니다. 하지만 제 경우에는 많은 비동기 호출을 반복해야합니다. 그러면 어떻게 할 수 있습니까?

답변

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); 
} 
+0

i가 약간 변경되었습니다. int idx = -1; 어쨌든 당신의 도움에 대해 대단히 감사합니다. 그것은 완벽하게 작동합니다. – Tum

+0

이 응답에서 변경되었습니다. –

+0

idx = -1로 설정하면 idx ++를 ++ idx로 변경해야합니다. onSuccess 블록이 끝날 때 idx를 늘리면 코드가 명확 해집니다 (코드가 이렇게 변경되었습니다). –