假设我有一个事件处理程序,它向服务器发出两次 AJAX 调用:
$("#foo").click(function(){
$.get("bar", function(){ alert("Hello"); });
$.get("baz", function(){ alert("World"); });
});
我意识到调用回调的顺序是不确定的,因为它取决于每个请求需要多长时间等。
但我的问题是:是否能保证在调用任一回调函数之前到达事件处理程序的末尾?我读过页面的所有 Javascript 都在单个线程中执行,所以我认为这意味着我的click
保证事件处理程序在调用任何回调之前完成。
它是否正确?或者,第一个请求是否可能已完成并且第一个回调在我们到达事件处理程序末尾之前执行?
是的,这是有保证的,你是对的 - 只有一个线程(忽略网络工作者暂时)。当一段 JavaScript 代码执行(占用执行线程)并且 AJAX 回调到达(或任何其他 GUI 事件、超时等)时,它会排队等待,直到执行线程空闲(当前代码段完成)。
JavaScript 引擎永远不会中断正在运行的代码来处理传入的事件 - 事件将始终在队列中轻轻等待。这就是为什么当执行 CPU 密集型代码时 GUI 似乎冻结的原因 - 没有处理任何事件。这也是同步 AJAX 请求不好的原因。
See also
- JavaScript 相当于 SwingUtilities.invokeLater()
- 异步 ajax 回调干扰的“原子”操作
- 是否有任何原子 JavaScript 操作可以处理 Ajax 的异步特性?
- javascript 中如何实现异步编程(promise)? javascript不是一个ui线程环境吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)