2011-08-09 28 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只在异步调用从服务器端返回后才被调用。