2
rpc.call(mycallback);

{
//subsequent code block

}
  1. 单线程异步回调如何工作?
  2. 回调何时被调用?
  3. 后续代码块是否总是在回调被允许运行之前完成执行(即回调是否只会在所有代码完成后才运行?)?
4

4 回答 4

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):

GWT-RPC 使用了基于 XMLHttpRequest 的 RequestBuilder。XMLHttpRequest (XHR) 使用事件与代码进行回通信,因此 XHR 上发生的任何事情都会导致事件被推送到事件队列中,并由事件循环出列。

另请参阅GWT 文档

于 2013-04-04T19:35:09.470 回答
1

目前没有区别

rpc.call(mycallback);
{
   //subsequent code block
}

或者

{
   // code block before
}
rpc.call(mycallback);

但是,我认为没有任何理由依赖这种行为。如果要确保代码块已被执行,请使用第二个版本

于 2013-04-04T19:40:03.060 回答
0

#1 javascript是单线程的,但是浏览器不是,所以js-thread发送xhr调用给浏览器去解析,浏览器马上把控制权返回给它。

#2 当浏览器从服务器获得响应时,它将回调排队到 js 线程中,因此它将在 js 完成它现在可以执行的任何事情时执行(在你的情况下是后续代码块)

#3 是的,它会的,因为这个块的单线程执行会阻止任何其他延迟代码(超时、回调)的执行,直到它完成。

于 2013-04-05T07:40:49.807 回答
-2

由于调用是异步进行的,因此您不知道回调何时从服务器返回。

所以,

当代码服务器调用开始时//subsequent code block开始执行,当调用结束时onSuccess代码块中的代码开始执行。

如果onSuccess 代码块后续代码块是独立的,则在服务器命中之前之后调用没有区别。

如果两者都依赖

rpc.call(new AsynchCallback { 
        onSucees(){
                   //subsequent code block
                  }
   });
于 2013-04-04T20:07:58.613 回答