rpc.call(mycallback);
{
//subsequent code block
}
- 单线程异步回调如何工作?
- 回调何时被调用?
- 后续代码块是否总是在回调被允许运行之前完成执行(即回调是否只会在所有代码完成后才运行?)?
rpc.call(mycallback);
{
//subsequent code block
}
使用 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):
GWT-RPC 使用了基于 XMLHttpRequest 的 RequestBuilder。XMLHttpRequest (XHR) 使用事件与代码进行回通信,因此 XHR 上发生的任何事情都会导致事件被推送到事件队列中,并由事件循环出列。
另请参阅GWT 文档。
目前没有区别
rpc.call(mycallback);
{
//subsequent code block
}
或者
{
// code block before
}
rpc.call(mycallback);
但是,我认为没有任何理由依赖这种行为。如果要确保代码块已被执行,请使用第二个版本
#1 javascript是单线程的,但是浏览器不是,所以js-thread发送xhr调用给浏览器去解析,浏览器马上把控制权返回给它。
#2 当浏览器从服务器获得响应时,它将回调排队到 js 线程中,因此它将在 js 完成它现在可以执行的任何事情时执行(在你的情况下是后续代码块)
#3 是的,它会的,因为这个块的单线程执行会阻止任何其他延迟代码(超时、回调)的执行,直到它完成。
由于调用是异步进行的,因此您不知道回调何时从服务器返回。
所以,
当代码服务器调用开始时//subsequent code block
开始执行,当调用结束时onSuccess
代码块中的代码开始执行。
如果onSuccess 代码块 和 后续代码块是独立的,则在服务器命中之前或之后调用没有区别。
如果两者都依赖
rpc.call(new AsynchCallback {
onSucees(){
//subsequent code block
}
});