2016-05-19 60 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); 
     } 
    } 
} 

这是相当丑陋的,但会确保只有在前一次返回成功时才会触发下一次呼叫。

我建议不要实现这个异步调用链接,而是一次请求来自服务器的所有结果。