假设我有一个事件处理程序,它对服务器进行了两次AJAX调用:
$("#foo").click(function(){ $.get("bar", function(){ alert("Hello"); }); $.get("baz", function(){ alert("World"); }); });
我意识到,调用回调的顺序是不确定的,因为它取决于每个请求花费的时间等。
但是,这是我的问题:是否可以保证在调用两个回调函数之前到达事件处理程序的末尾?我已经读过页面的所有Javascript都在一个线程中执行,因此我认为这意味着click在可以调用任何回调之前,一定要完成我的事件处理程序。
click
这样对吗?还是有可能第一个请求可能已经完成,并且在我们到达事件处理程序的结尾之前就执行了第一个回调?
是的,这是可以保证的,而且您是对的-只有一个线程(暂时不考虑web-worker)。当一段JavaScript代码执行(占用执行线程)并且AJAX回调到达(或任何其他GUI事件,超时等)时,它将排队并等待直到执行线程空闲(当前代码段完成)。
JavaScript引擎将永远不会中断正在运行的代码来处理传入事件-事件将始终在队列中轻轻等待。这就是在执行CPU密集型代码时GUI似乎冻结的原因- 不处理任何事件。这也是同步AJAX请求不正确的原因。