假设我有一个事件处理程序,可以对服务器进行两个
AJAX调用:
$("#foo").click(function(){ $.get("bar",function(){ alert("Hello"); }); $.get("baz",function(){ alert("World"); }); });
我意识到调用回调的顺序是非确定性的,因为它取决于每个请求需要多长时间等等.
但这是我的问题:是否保证在调用任何一个回调函数之前,我将到达我的事件处理程序的结尾?我已经阅读了一个页面的所有Javascript在一个单独的线程中执行,所以我认为这意味着我的点击事件处理程序保证在任何回调可以被调用之前完成.
它是否正确?或者可能第一个请求可能已经完成,并且在我们甚至到达事件处理程序结束之前执行第一个回调?
解决方法
是的,这是有保证的,你是对的 – 只有一个线程(暂时忽略了
web-workers).当执行一段JavaScript代码(占用执行线程)和AJAX回调到达(或任何其他GUI事件,超时等)时,它将排队等待,直到执行线程空闲(当前代码段完成).
JavaScript引擎永远不会中断运行代码来处理传入的事件 – 事件将始终在队列中轻轻等待.这就是当cpu密集型代码执行时,GUI似乎冻结的原因 – 没有事件被处理.这也是为什么同步的AJAX请求是坏的.
也可以看看
> JavaScript equivalent of SwingUtilities.invokeLater()
> “atomic” operation desturbed by asynchronous ajax callbacks
> Are there any atomic javascript operations to deal with Ajax’s asynchronous nature?
> how is async programming (promises) implemented in javascript? isn’t javascript a ui-threaded environment?