GWT单线程异步回调

时间:2013-04-04 19:16:00

标签: gwt asynchronous gwt-rpc single-threaded

rpc.call(mycallback);

{
//subsequent code block

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

4 个答案:

答案 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
                  }
   });