【问题标题】:GWT method returns before RequestBuilder ajax call finishesGWT 方法在 RequestBuilder ajax 调用完成之前返回
【发布时间】:2013-06-21 06:16:21
【问题描述】:

这是我目前的代码(这是使用 GWT):

private ArrayList<tObjects> getSuggestions(String query)
{
    // Clear previous suggestions
    Window.alert("Clearing arraylist");
    arrayList.clear();
    query = query.toUpperCase().replace(" ", "");

    RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "xmlfile.php?query="+query);
    rb.setHeader("Content-Type", "application/x-www-form-urlencoded");

    try
    {
        rb.sendRequest(null, new RequestCallback()
        {

            @Override
            public void onResponseReceived(com.google.gwt.http.client.Request request, com.google.gwt.http.client.Response response)
            {
                Window.alert(response.getText());

                    // Do a lot of data processing here.
                    Window.alert("Adding to arraylist");
                    addToArrayList(data);


                }

            }

            @Override
            public void onError(com.google.gwt.http.client.Request request, Throwable exception)
            {
                // TODO Auto-generated method stub

            }
        });
    }
    catch(RequestException e)
    {
        Window.alert(e.toString());
    }
    Window.alert("Returning arraylist. "+arrayList.toString());
    return arrayList;
}

我正确收到响应,但该方法在添加之前返回(空)arrayList。如果我删除 arrayList.clear(),在下一个 ajax 调用中我会看到上一个调用的结果。当我查看警报时,按以下顺序着火:

1) "清除数组列表。"

2) “返回数组列表。”

3) 来自 ajax 的正确响应的警报

4) "添加到数组列表"

在返回并完成该方法之前,该方法似乎没有等待 ajax 完成。在我到达 return 语句之前,如何让它等待 arrayList 的 ajax 和填充?

谢谢!

【问题讨论】:

    标签: java ajax gwt


    【解决方案1】:

    异步调用意味着非阻塞代码!您必须考虑异步,例如,永远不要依赖应该返回使用异步调用检索的内容的方法:将您的应用程序设计为不等待数据,但是等待回复。

    通常这是通过将逻辑放在onResponseReceived() 方法中,或传入将被调用的回调,或使用事件来完成的。

    【讨论】:

      【解决方案2】:

      AJAX 代表异步 Javascript 和 XML

      您的请求构建器正在执行异步调用。这意味着执行服务器调用的方法将始终在您发送请求后立即返回,在您的答复返回之前。

      在你的例子中

      rb.sendRequest
      

      在收到响应之前几乎会立即返回。

      这就是您将回调方法作为参数传递的原因(onResponseReceived 方法和 onError 方法)。一旦服务器处理了您的请求并且您的答案已发送回您的客户端,就会调用回调。

      现在如果你想在你的回调方法被调用后执行一些事情(一旦你收到你的数组),你可以/应该使用事件。在您的回调方法onResponseReceived 中,您可以触发和事件,例如ArrayListReceived。您在您的班级或任何其他共享同一事件总线的班级中侦听该事件,并对该数组执行您想做的任何事情。

      这就是事件总线如此有用的原因。

      顺便说一句,您不应该尝试在 Web 应用程序中进行同步调用,因为它会在等待响应时冻结您的客户端。由于 Javascript 是单线程的(我不知道 GWT 是否支持 Web Worker),如果您使用同步方法,则在等待调用返回时无法继续任何处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 2010-10-19
        • 1970-01-01
        相关资源
        最近更新 更多