-1

here's my code so far (this is using 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;
}

I receive the response correctly, but the method returns the (empty) arrayList before it is added. If i remove the arrayList.clear(), on the next ajax call I see the result of the previous call. When I look at the alerts, the fire in this order:

1) "Clearing arrayList."

2) "Returning arrayList."

3) Alert with correct response from ajax

4) "Adding to arrayList"

It seems like the method is not waiting for the ajax to complete before returning and finishing the method. How can I make it wait for the ajax & population of the arrayList before I get to the return statement?

Thanks!

4

2 回答 2

0

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

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

于 2013-06-21T08:51:03.713 回答
0

AJAX代表异步 Javascript 和 XML

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

在你的例子中

rb.sendRequest

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

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

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

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

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

于 2013-06-21T09:03:06.930 回答