这是我目前的代码(这是使用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的数量是多少?
谢谢!
答案 0 :(得分:0)
异步调用意味着非阻塞代码!您必须认为异步,例如,永远不要依赖应该返回使用异步调用检索的内容的方法:将应用程序设计为不等待数据,但< em>等待回复。
通常,这是通过将逻辑置于onResponseReceived()
方法内,或传入将被调用的回调或使用事件来完成的。
答案 1 :(得分:0)
AJAX代表异步Javascript和XML
您的请求构建器正在进行异步调用。这意味着执行服务器调用的方法将始终在您发送请求后返回,直到您的答案回来。
在你的例子中
rb.sendRequest
在收到回复之前,几乎会立即返回。
这就是您将回调方法作为参数传递的原因(onResponseReceived方法和onError方法)。一旦您的请求被服务器处理并且您的答案已经发送回客户端,将会调用回调。
现在,如果要在调用回调方法后执行某些操作(一旦收到数组),就可以/应该使用事件。在您的回调方法onResponseReceived
中,您可以触发和事件,例如ArrayListReceived。您可以在您的班级或任何其他共享相同事件总线的类中监听该事件,并执行您想要对该阵列执行的操作。
这就是事件总线如此有用的原因。
顺便说一句,您不应该尝试在Web应用程序中进行同步调用,因为它会在等待答案时冻结您的客户端。由于Javascript是单线程的(我不知道GWT中是否支持Web worker)如果使用同步方法,则在等待调用返回时无法继续任何处理。