2011-08-09 64 views
0

我在GWT中執行throw執行時遇到問題。所以我想在位於「服務器端」的客戶端顯示一個簡單的字符串列表。好吧,我在我的主類中有這個屬性:GWT異步調用執行順序問題

private final GreetingServiceAsync greetingService = Util.getInstance(); //這就像>輸入GWT.create(GreetingService.class); public ArrayList songs = new ArrayList();

,並在我的onModuleLoad()方法,我必須使異步調用服務器類的另一個私有方法的調用:

songs.addAll(getSongsList());

所以我getSongsList方法如下:

public ArrayList<String> getSongsList() { 
     final int defaultSize = 4; 
     final ArrayList<String> temp = new ArrayList<String>(); 

     GWT.log("Enter in getSongsLists"); 
     greetingService.greetSongMostPopular(defaultSize, 
       new AsyncCallback<ArrayList<String>>() { 

        public void onSuccess(ArrayList<String> result) { 
         GWT.log("Result is:" + result); 
         temp.addAll(result); 
         GWT.log("Case 1 TEMP= " + temp); 
        } 

        public void onFailure(Throwable caught) { 
         // throw new 
         // UnsupportedOperationException("Not supported yet."); 
         Window.alert("Error greeting data"); 

        } 

       }); 
     GWT.log("CASE 2 TEMP = " + temp); 
     return temp; 

    } 

我的問題是,在案例1,我得到

[INFO] [MainModule] - 案例1個TEMP = [宋1 ,Song 2,Song 3,Song 4]

但是在CASE 2中我得到ArrayList爲空!

[INFO] [MainModule] - 案例1 TEMP = []

我在做什麼錯?

在此先感謝!

+0

嗨,我很喜歡類似的問題。你能告訴你做了什麼嗎?我的問題是在這個鏈接http://stackoverflow.com/q/9788970/1046176 – NewCodeLearner

回答

1

對greetSongsMostPopular的調用是異步的。這意味着調用開始,代碼直接繼續到下一行代碼,在你的情況GWT.log(「CASE 2 TEMP ...」)。當這行代碼執行時,結果尚不可用,最終會出現一個空列表。

後來,在後臺,onSuccess與結果一起被調用。此時你應該調用一個函數來處理結果。您可以使用類似於AsyncCallback類的模式,並使用onSuccess和onFailure,以便此代碼的調用者可以處理這兩種情況,或者您可以讓調用者傳遞自己的AsyncCallback實例,使其成爲您的greetSongsMostPopular RPC功能。

0

這是正常的:當你的服務器發送答案但是greetSongMostPopular返回時調用回調函數。

該調用是異步的。

所有代碼都必須在回調來完成(調用一個函數)

這裏是確切的過程:

  • greetingService.greetSongMostPopular叫
  • 溫度爲空
  • 第二GWT .log被調用:temp始終爲空
  • getSongsList方法返回:temp始終爲空
  • 服務器將回答發送給回調:臨時填充
0

你沒有做錯什麼。這是預料之中的,因爲你沒有處理同步呼叫。所以情況2只在異步調用從服務器端返回後才被調用。