GWT 单线程异步回调

Posted

技术标签:

【中文标题】GWT 单线程异步回调【英文标题】:GWT Single threaded async callbacks 【发布时间】:2013-04-04 19:16:00 【问题描述】:
rpc.call(mycallback);


//subsequent code block


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

【问题讨论】:

【参考方案1】:

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

另请参阅GWT documentation。

【讨论】:

***.com/questions/9999056/…。据此,代码块保证在回调运行之前完成。【参考方案2】:

目前没有区别

rpc.call(mycallback);

   //subsequent code block


   // code block before

rpc.call(mycallback);

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

【讨论】:

其实是有区别的....如果代码块执行时间过长会延迟对服务器的调用。 “长时间”是什么意思?长时间运行的脚本会导致弹出警告。考虑为长时间运行的情况使用工作线程【参考方案3】:

#1 javascript是单线程的,而浏览器不是,所以js-thread发送xhr调用给浏览器解析,浏览器立即将控制权返回给它。

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

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

【讨论】:

【参考方案4】:

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

所以,

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

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

如果两者都依赖

rpc.call(new AsynchCallback  
        onSucees()
                   //subsequent code block
                  
   );

【讨论】:

以上是关于GWT 单线程异步回调的主要内容,如果未能解决你的问题,请参考以下文章

单线程异步回调机制的缺陷与node的解决方案

JavascriptJs同步异步以及回调函数

在构造函数中进行 GWT 异步回调安全吗?

day 32异步+回调线程queue线程Event协程单线程下实现遇到IO切换

在 GWT 异步回调中,如何在 onSuccess 中处理相同的返回类型?

JavaScript为什么是单线程-JS异步与回调详解