GWT异步调用执行顺序问题

GWT异步调用执行顺序问题,gwt,Gwt,我对GWT中的抛出执行有问题。所以我想在“服务器端”的客户端显示一个简单的字符串列表。好的,我在我的主要课程中有以下几点: private final GreetingServiceAsync greetingService=Util.getInstance();//这就像>键入GWT.create(GreetingService.class); public ArrayList songs=new ArrayList() 在我的onModuleLoad()方法中,我调用了另一个私有方法,该方法

我对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;

    }
public ArrayList getSongsList(){
最终int defaultSize=4;
最终ArrayList温度=新ArrayList();
GWT.log(“输入GetSongsList”);
greetingService.greetSongMostPopular(默认大小,
新的AsyncCallback(){
成功时公共无效(ArrayList结果){
GWT.log(“结果为:”+Result);
温度加总(结果);
GWT.log(“案例1温度=”+TEMP);
}
失败时的公共无效(可丢弃){
//抛出新的
//UnsupportedOperationException(“尚未支持”);
窗口警报(“错误问候数据”);
}
});
GWT.log(“情况2温度=”+TEMP);
返回温度;
}
我的问题是在第一种情况下

[信息][主模块]-案例1温度=[歌曲1、歌曲2、歌曲3、歌曲4]

但是在案例2中,我得到的ArrayList是空的

[信息][主模块]-案例1温度=[]

我做错了什么


提前谢谢

这是正常的:当服务器发送答案时会调用回调,但大多数人会立即返回

调用是异步的

所有代码都必须在回调中完成(调用函数)

以下是确切的过程:

  • greetingService.greetSongMostPopular被称为
  • 温度为空
  • 第二个GWT.log被称为:temp始终为空
  • getSongsList方法return:temp始终为空
  • 服务器将应答发送到回调:temp已填充

对greetSongsMostPopular的调用是异步的。这意味着调用开始,代码直接继续到下一行代码,在您的案例GWT.log(“case2temp…”)中。当执行这一行代码时,结果还不可用,您将得到一个空列表


稍后,在后台调用onSuccess并显示结果。此时,您应该调用一个函数来处理结果。您可以使用类似于AsyncCallback类的模式,使用onSuccess和onFailure使此代码的调用者可以处理这两种情况,或者您可以让调用者传入他们自己的AsyncCallback实例,这将使它成为GreetSongsHostPopular RPC函数的薄包装器。

您没有做错任何事情。这是预期的,因为您不处理同步调用。因此,只有在异步调用从服务器端返回后才会调用案例2。

Hi,我遇到了类似的问题。你能告诉我你做了什么吗。我的问题是关于这个链接