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代码块和后续代码块是独立的,则调用before或after没有区别服务器命中。
如果两者都依赖
rpc.call(new AsynchCallback
onSucees()
//subsequent code block
);
【讨论】:
以上是关于GWT 单线程异步回调的主要内容,如果未能解决你的问题,请参考以下文章
day 32异步+回调线程queue线程Event协程单线程下实现遇到IO切换