【问题标题】:GWT Async call execution order problemGWT Async 调用执行顺序问题
【发布时间】:2011-08-09 16:40:43
【问题描述】:

我在 GWT 中执行 throw 时遇到问题。所以我想在位于“服务器端”的客户端显示一个简单的字符串列表。好的,我的 Main 类中有这个属性:

private final GreetingServiceAsync greetingService = Util.getInstance(); // 这就像 > 键入 GWT.create( GreetingService.class ); public ArrayList 歌曲 = 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] - Case 1 TEMP= [Song 1, Song 2, Song 3, Song 4]

但在案例 2 中,我将 ArrayList 设为空!!!

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

我做错了什么?

提前致谢!

【问题讨论】:

标签: gwt


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    调用是异步的。

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

    具体流程如下:

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

    【讨论】:

      【解决方案3】:

      你没有做错任何事。这是意料之中的,因为您不处理同步调用。所以情况2只有在异步调用从服务器端返回后才会被调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-03
        • 2021-03-07
        • 2022-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        相关资源
        最近更新 更多