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/7575589/

相关文章:

javascript - Javascript 中的 JSON 字符串解析

javascript - 读取本地 XML 文件进行解析

javascript - 通过自定义组件将 props 添加到 styled-component

javascript - 如何使用jquery从选择标签中选择选项值

javascript - 将字符串文字内的函数传递给其他组件

javascript - 不可变的 js - 创建或更新嵌套在 map 内的列表

javascript - XHR.getAllResponseHeaders() 不会像 Chrome 60 中预期的那样返回 header

javascript - 阻止 Chrome 中不包含特定模式的请求 URL

ajax - UIWebViewDelegate 不监控 XMLHttpRequest?

javascript - 检测youtube时间,然后显示DIV?使用JavaScript