2011-09-27 49 views
123

由于JavaScript运行在一个线程中,在发出AJAX请求后,背景中实际发生了什么?我想深入了解这一点,任何人都可以点亮一下吗?JavaScript如何在后台处理AJAX响应?

+5

一个很不错的描述在这里:http://stackoverflow.com/questions/2914161/ajax-multi-threaded –

+3

JavaScript代码是单线程的(web工作者除外),但不是运行JavaScript引擎的浏览器... –

+0

@JuanMendes当事件队列在另一个线程中运行时,JavaScript是否在一个线程中运行? –

回答

190

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

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

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

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

这里有一些细节的文章:

+6

好的答案。参考文献将使它成为一个很好的答案:) – Jeff

+8

添加参考。 – jfriend00

+0

谢谢你。我怀疑是这样,但很确定。我有一个for循环,其中我发出了很多'ajax'请求。在我的处理程序中(对于每个请求 - 以任意顺序返回),我运行一些可能需要一些时间的代码。很高兴知道这应该肯定工作。 – iPadDeveloper2011

15

您可以找到here上的事件在JavaScript处理一个非常完整的文档。
它是由一个在Opera浏览器中执行javascript实现的人写的。

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

  1. 的Javascript运行在一个单独的线程每个浏览器标签或窗口。
  2. 事件按顺序排队并执行。
  3. XMLHttpRequest由实现运行,并使用事件队列运行回调。

注意:原始链接是:link,但现在已经死亡。

+0

很好的解释.. – refactor