事件处理程序是否可以在调用AJAX回调之前完成?

Eli*_*ght 11 javascript ajax asynchronous

假设我有一个事件处理程序,它对服务器进行两次AJAX调用:

$("#foo").click(function(){ 
    $.get("bar", function(){ alert("Hello"); });
    $.get("baz", function(){ alert("World"); });
});
Run Code Online (Sandbox Code Playgroud)

我意识到调用回调的顺序是不确定的,因为它取决于每个请求需要多长时间等.

但这是我的问题:是否保证在调用任何一个回调函数之前我将到达事件处理程序的末尾?我已经读过一个页面的所有Javascript都在一个线程中执行,所以我认为这意味着我click可以保证在调用任何回调之前完成我的事件处理程序.

它是否正确?或者第一个请求是否可能完成并且在我们甚至到达事件处理程序结束之前执行了第一个回调?

Tom*_*icz 11

是的,这是有保证的,你是对的 - 只有一个线程(暂时忽略).当一段JavaScript代码执行(占用执行线程)并且AJAX回调到达(或任何其他GUI事件,超时等)时,它会排队等待,直到执行线程空闲(当前代码完成).

JavaScript引擎永远不会中断正在运行的代码来处理传入事件 - 事件将始终在队列中轻轻等待.这就是为什么在执行CPU密集型代码时GUI似乎冻结的原因 - 没有处理任何事件.这也是同步AJAX请求不好的原因.

也可以看看