javascript - 是否保证事件处理程序在调用 AJAX 回调之前完成?

标签 javascript ajax asynchronous

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

$("#foo").click(function(){ 
    $.get("bar", function(){ alert("Hello"); });
    $.get("baz", function(){ alert("World"); });
});

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

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

这是正确的吗?或者是否有可能第一个请求可能已经完成并且第一个回调在我们到达事件处理程序结束之前就已执行?

最佳答案

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

JavaScript 引擎永远不会中断正在运行的代码来处理传入的事件——事件总是在队列中缓慢地等待。这就是为什么在执行 CPU 密集型代码时 GUI 似乎卡住的原因 - 没有处理任何事件。这也是同步 AJAX 请求不好的原因。

另见

关于javascript - 是否保证事件处理程序在调用 AJAX 回调之前完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999056/

相关文章:

javascript - Node.JS - promise 异步/等待示例

javascript - 用ajax替换anchor

javascript - 谷歌地图调整大小不起作用

javascript - 跨站点脚本(没有 iframe 或任何东西)

php - 每次更新数据库时如何刷新一个div?

javascript - 无法在 vue.js 中使用 ccxt 的 load_markets() 列出市场

javascript - 在 window.open 请求中添加 header 的可能方法

javascript - canvas.toBlob() 在 MSEdge 浏览器中的兼容性

jquery - 我正在向服务器发出 Ajax 发布请求,所有数据都很好,但我的名字和姓氏正在更新为 "undefined"

swift - 同步和异步如何与线程安全一起工作?