javascript - JavaScript 如何在后台处理 AJAX 响应?

标签 javascript xmlhttprequest

由于 JavaScript 在单线程中运行,因此发出 AJAX 请求后,后台实际上会发生什么?我想更深入地了解这一点,有人能解释一下吗?

最佳答案

在底层,JavaScript 有一个事件队列。每次 javascript 线程执行完成时,它都会检查队列中是否还有另一个事件需要处理。如果有,它将其从队列中拉出并触发该事件(例如,单击鼠标)。

位于 ajax 调用下的 native 代码网络将知道 ajax 响应何时完成,并且事件将添加到 JavaScript 事件队列中。 native 代码如何知道 ajax 调用何时完成取决于实现。它可以用线程实现,也可以是事件驱动本身(这并不重要)。实现的要点是,当 ajax 响应完成时,一些 native 代码会知道它已完成并将事件放入 JS 队列中。

如果当时没有运行 Javascript,该事件将立即触发,从而运行 ajax 响应处理程序。如果当时正在运行某些内容,则该事件将在当前执行的 javascript 线程完成时得到处理。 JavaScript 引擎不需要进行任何轮询。当一段 Javascript 执行完毕时,JS 引擎只是检查事件队列,看看是否还有其他需要运行的内容。如果是,它将从队列中弹出下一个事件并执行它(调用为该事件注册的一个或多个回调函数)。如果事件队列中没有任何内容,则 JS 解释器有空闲时间(垃圾收集或空闲),直到某些外部代理将其他内容放入事件队列中并再次唤醒它。

因为所有外部事件都会经过事件队列,并且当 javascript 实际运行其他内容时不会触发任何事件,因此它保持单线程。

以下是一些有关详细信息的文章:

关于javascript - JavaScript 如何在后台处理 AJAX 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28335801/

相关文章:

javascript - 尝试创建一个运行脚本的按钮,但是 H1 和按钮在单击时消失

javascript - PHP AJAX JQuery xmlhttp 请求 Get 方法发送始终为 1

javascript - Ajax Jquery删除功能很慢

javascript - 将窗口对象传递到 Javascript 命名空间

javascript - (类型错误) : Cannot call method 'setBadgeText' of undefined

javascript - 每个 Web 请求传输的字节数

javascript - 为什么我的 req.body 在 POST 时总是为空?

javascript - jQuery UI Droppable,不通过特定 DIV 传播事件

javascript - 为当前域上的每个链接添加/保留查询字符串(如果存在)

javascript - 从 JavaScript 访问 google drive 文件内容