rpc.call(mycallback);
{
//subsequent code block
}
答案 0 :(得分:2)
使用GWT-RPC,异步回调如下所示:
AsyncCallback<ResultBean> callback = new AsyncCallback<ResultBean>() {
public void onSuccess(ResultBean result) {
// Code to run once callback completes
}
public void onFailure(Throwable caught) {
// Error handling code
}
};
asyncService.call(callback);
// Subsequent code block
从服务器收到结果后,将调用onSuccess()
方法。后续代码块将在回调完成之前执行,因为单个线程必须先完成当前事件的执行,然后才能处理队列中的下一个事件。为了确保在回调完成后执行某些代码,应该从onSuccess()
方法调用它。
以下是关于如何在单线程环境中工作的技术说明(来自Thomas Broyer的here):
GWT-RPC使用RequestBuilder,它基于XMLHttpRequest。 XMLHttpRequest(XHR)使用事件与代码进行通信,因此 XHR上发生的任何事情都会导致事件被推送到 事件队列,并由事件循环出列。
另请参阅GWT documentation。
答案 1 :(得分:1)
目前
之间没有区别rpc.call(mycallback);
{
//subsequent code block
}
或
{
// code block before
}
rpc.call(mycallback);
但是,我认为没有理由依赖这种行为。 如果要确保已执行代码块,请使用第二个版本
答案 2 :(得分:0)
#1 javascript是单线程,但浏览器不是,所以js-thread将xhr调用发送给浏览器解析它,浏览器立即将控件返回给它。
#2当浏览器从服务器获得响应时,它将回调排队到js线程中,因此当js完成现在可以执行的任何操作时将执行它(在您的情况下是后续代码块)
#3是的,因为这个块的单线程执行会阻止执行任何其他延迟代码(超时,回调),直到它完成。
答案 3 :(得分:-2)
由于调用是异步的,因此您不知道回调何时从服务器返回。
所以,
代码服务器调用启动时//subsequent code block
开始执行,而当调用结束时,onSuccess
代码块中的代码开始执行。
如果 onSuccess代码块且后续代码块是独立的,那么在之前调用或在之后调用没有区别服务器点击。
如果两者都是依赖
rpc.call(new AsynchCallback {
onSucees(){
//subsequent code block
}
});