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

由于JavaScript是在单线程中运行的,所以在发出AJAX请求之后,背景中究竟发生了什么? 我想对此有更深入的了解,谁能解释一下?

在封面之下,javascript有一个事件队列。 每次执行完一个JavaScript线程,它都会检查队列中是否有另一个事件要处理。 如果有,则将其从队列中拉出并触发该事件(例如,像点击鼠标那样)。

位于ajax调用下的本地代码networking将知道ajax响应何时完成,并且事件将被添加到javascript事件队列中。 本地代码如何知道ajax调用何时完成取决于实现。 它可以用线程来实现,或者也可以是事件驱动(它并不重要)。 实现的要点是,当ajax响应完成时,一些本地代码将知道它已经完成,并将一个事件放入JS队列中。

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

由于所有外部事件都经过事件队列,并且在JavaScript实际运行其他事件时不会触发任何事件,因此它保持单线程状态。

这里有一些关于细节的文章:

  • Javascript定时器如何工作 – 由John Resig编写
  • 事件和时间深度
  • W3规范:HTML5事件循环
  • MDN关于Event Loop的文章
  • 演示JS事件队列
  • JavaScript事件循环:解释
  • 五种模式来帮助驯服asynchronousJavaScript
  • Javascript事件循环演示
  • video讨论Javascript如何工作(包括10:27的事件循环)

你可以在这里find一个非常完整的JavaScript文档。
它是由一个在Opera浏览器中使用JavaScript实现的人写的。

更确切地说,看标题:“事件stream”,“事件排队”和“非用户事件”:您将了解到:

  1. Javascript在每个浏览器选项卡或窗口的单个线程中运行。
  2. 事件按顺序排队并执行。
  3. XMLHttpRequest由实现运行,并使用事件队列运行callback。

注:原始链接是: 链接 ,但现在已经死了。