GWT异步调用执行顺序问题

时间:2011-08-09 16:40:43

标签: gwt

我在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 = []

我做错了什么?

提前致谢!

3 个答案:

答案 0 :(得分:1)

对greetSongsMostPopular的调用是异步的。这意味着调用开始并且代码直接继续到下一行代码,在您的情况下为GWT.log(“CASE 2 TEMP ...”)。执行此行代码时,结果尚不可用,您最终会得到一个空列表。

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

答案 1 :(得分:0)

这是正常的:当您的服务器发送答案但greetSongMostPopular返回imediatly时调用回调。

调用是异步的。

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

这是确切的过程:

  • greetingService.greetSongMostPopular被称为
  • temp为空
  • 调用第二个GWT.log:temp始终为空
  • getSongsList方法返回:temp始终为空
  • 服务器向回调发送答案:temp已填写

答案 2 :(得分:0)

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