我在GWT中执行throw执行有问题。所以我想在位于“服务器端”的客户端显示一个简单的字符串列表。好的,我在我的Main类中有这个属性:
私人决赛GreetingServiceAsync greetingService = Util.getInstance(); //这就像>输入GWT.create(GreetingService.class); public ArrayList songs = new ArrayList();
在我的onModuleLoad()方法中,我调用另一个私有方法来调用Server类的异步:
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,歌曲2,歌曲3,歌曲4]
但是在CASE 2中我得到了ArrayList为空!!!
[INFO] [MainModule] - 案例1 TEMP = []
我做错了什么?
提前致谢!
答案 0 :(得分:1)
对greetSongsMostPopular的调用是异步的。这意味着调用开始并且代码直接继续到下一行代码,在您的情况下为GWT.log(“CASE 2 TEMP ...”)。执行此行代码时,结果尚不可用,您最终会得到一个空列表。
稍后,在后台使用结果调用onSuccess。此时,您应该调用一个函数来处理结果。您可以使用类似于AsyncCallback类的模式,使用onSuccess和onFailure,因此此代码的调用者可以处理这两种情况,或者您可以让调用者在他们自己的AsyncCallback实例中传递,这将使其成为围绕greetSongsMostPopular的薄包装器RPC功能。
答案 1 :(得分:0)
这是正常的:当您的服务器发送答案但greetSongMostPopular返回imediatly时调用回调。
调用是异步的。
所有代码必须在回调中完成(调用函数)
这是确切的过程:
答案 2 :(得分:0)
你没有做错任何事。这是预期的,因为您不处理同步调用。因此,只有在异步调用从服务器端返回后才会调用案例2。