2016-05-19 32 views
0

我是GWT新手,所以請幫助我。我有循環n次循環;每個循環都將AsyncCallback發送到服務器並獲取該值。但我想停止每個循環,直到服務器響應。例如Asynccallback with in for循環

for (final String cardId : cardIds) { 
    cmain.ivClient.getm(cardId, cardInfoKeys, new AsyncCallback<String[]>() { 

     @Override 
     public void onFailure(Throwable caught) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void onSuccess(String[] result) { 
      cardPar = result; 
     } 
    } 
} 

如何等待循環的每一次?

+1

你好,歡迎來到Stack Overflow!請在下次正確格式化您的代碼時,很難閱讀。您可以添加4個空格或選擇代碼,然後單擊工具欄中的「{}」按鈕。在提交之前,請務必查看您帖子下方顯示的預覽圖,看看它是否正常。另外,我不清楚你在問什麼。你已經嘗試了什麼,它是如何失敗的? – CherryDT

+1

爲什麼不直接發送所有'cardIds'? – Baz

+0

請記住將答案標記爲已接受,因爲這告訴其他人來看這個問題,其中一種解決方案適用於您的案例。您似乎已經提出了幾個問題(由其他成員提出),但您從未將其標記爲已接受。 – carlossierra

回答

2

基本上,在這種情況下你不能真正使用for循環。

如果您知道,會有3個呼叫,您可以堆疊異步呼叫: 在每個onSuccess()中,您將觸發下一個異步呼叫。

如果你不知道會有多少人,你可以遞歸調用onSuccess

void callServer(final List<String>cardIds) { 
    if(cardIds.isEmpty()) return; 

    cmain.ivClient.getm(cardId, cardInfoKeys, new AsyncCallback<String[]>() { 

     @Override 
     public void onFailure(Throwable caught) { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void onSuccess(String[] result) { 
      doImportantMatterWith(result); 
      cardIds.remove(0); 
      callServer(cardIds); 
     } 
    } 
} 

這是相當醜陋的,但會確保只有在前一次返回成功時纔會觸發下一次呼叫。

我建議不要實現這個異步調用鏈接,而是一次請求來自服務器的所有結果。