假设我有一个对服务器进行两次 AJAX 调用的事件处理程序:
$("#foo").click(function(){
$.get("bar", function(){ alert("Hello"); });
$.get("baz", function(){ alert("World"); });
});
我意识到调用回调的顺序是不确定的,因为它取决于每个请求需要多长时间等。
但这是我的问题:是否可以保证在调用任一回调函数之前到达事件处理程序的末尾?我读到页面的所有 Javascript 都在单个线程中执行,所以我认为这意味着我的 click
事件处理程序保证在调用任何回调之前完成。
这是正确的吗?或者是否有可能第一个请求可能已经完成并且第一个回调在我们到达事件处理程序结束之前就已执行?
最佳答案
是的,这是有保证的,你是对的 - 只有一个线程(暂时忽略 web-worker s)。当一段 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?
关于javascript - 是否保证事件处理程序在调用 AJAX 回调之前完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999056/