2013-03-30 61 views
1

你好我有功能類似的:GWT返回值時異步回調結束

@Override 
    public boolean checkExist(String name) { 

     final boolean check[] = new boolean[] { false }; 

     getAllRecordFromServer(new SearchCallback() { 

      @Override 
      public void onSearchResult(Map<String, Item> itemsMap) { 
      //do some action set true when map key equals name 
       check[0] = true; 
      } 

      @Override 
      public void onSearchError(XMLPacket error) { 
       // TODO Auto-generated method stub 

      } 
     }); 

     return check[0]; 
    } 

I`am尋找解決方案,並發現了一些文章,但我不知道該怎麼做,在GWT:/ 這代碼無法正常工作......如你所知這是異步回調。

我該如何解決這個問題,我必須在回調結束後返回值。

+1

問題是,那不是異步! http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/faca1575f306ba0f/3be719c021aa19bd(作爲評論而不是答案,因爲它不是我的,而且它是一個外部鏈接)。 –

回答

1
This code is not working properly ... 

的原因是,你的代碼是在synchronous model和你正在Asynchronous calls

我假設你在onSearchResult得到一些結果後做了一些事情。

因此,停止執行您的代碼,直到您得到服務器的響應,爲什麼因爲你不知道callmay有時會失敗。

如果你真的想在全球範圍內使用的值,然後

public boolean returnVal=false; 

public void checkExist(String name, MyCallback callback) { 
     getAllRecordFromServer(new SearchCallback() { 
      @Override 
      public void onSearchResult(Map<String, Item> itemsMap) { 
        returnVal=true; 
        proceedFurther(itemsMap) //your next lines of code in this method. 
      } 

      @Override 
      public void onSearchError(XMLPacket error) { 
      stopProceedFurther(); //show some error message to user. 
      } 
     }); 
6

無法像您那樣從方法中的異步調用中返回值。這是「異步」調用的基本性質。你永遠不知道它什麼時候會返回(網絡/服務器延遲),因此你的代碼執行不會等待!!!!!

不要從您的方法返回布爾值。而是讓你的方法進行回調。

interface MyCallback { 
    execute(boolean successfl); 
} 

public void checkExist(String name, MyCallback callback) { 
     getAllRecordFromServer(new SearchCallback() { 
      @Override 
      public void onSearchResult(Map<String, Item> itemsMap) { 
      //do some action set true when map key equals name 
       callback.execute(true); 
      } 

      @Override 
      public void onSearchError(XMLPacket error) { 
      } 
     }); 
} 
2

也許更清潔的解決辦法可能是使用事件和eventbus(可以是私有的類或可能由大家共享,以便其他組件可以對此作出反應),當你得到你的結果或不。然後聽取這些事件並相應地對待它們。

getAllRecordFromServer(new SearchCallback() { 

    @Override 
    public void onSearchResult() { 
     eventBus.fireEvent(new FoundEvent()); 
    } 

    @Override 
    public void onSearchError() {    
     eventBus.fireEvent(new NotFoundEvent()); 
    } 
});