GWT方法在RequestBuilder ajax调用完成之前返回

时间:2013-06-21 06:16:22

标签: java ajax gwt

这是我目前的代码(这是使用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;
}

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

1)“清除arrayList。”

2)“返回arrayList。”

3)来自ajax的正确回复的警报

4)“添加到arrayList”

似乎该方法不是在返回和完成方法之前等待ajax完成。我怎样才能让它等待ajax&amp;在我到达return语句之前,arrayList的数量是多少?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

AJAX代表异步Javascript和XML

您的请求构建器正在进行异步调用。这意味着执行服务器调用的方法将始终在您发送请求后返回,直到您的答案回来。

在你的例子中

rb.sendRequest
在收到回复之前,

几乎会立即返回。

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

现在,如果要在调用回调方法后执行某些操作(一旦收到数组),就可以/应该使用事件。在您的回调方法onResponseReceived中,您可以触发和事件,例如ArrayListReceived。您可以在您的班级或任何其他共享相同事件总线的类中监听该事件,并执行您想要对该阵列执行的操作。

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

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