由于JavaScript运行在一个线程中,在发出AJAX请求后,背景中实际发生了什么?我想深入了解这一点,任何人都可以点亮一下吗?JavaScript如何在后台处理AJAX响应?
回答
在封面之下,javascript有一个事件队列。每次执行的JavaScript线程完成时,它都会检查队列中是否有其他事件要处理。如果存在,则将其从队列中拉出并触发该事件(例如,像点击鼠标一样)。
位于ajax调用下的本地代码网络将知道何时完成了ajax响应,并且事件将被添加到javascript事件队列中。本机代码如何知道ajax调用何时完成取决于实现。它可以用线程来实现,也可以是事件驱动(它并不重要)。实现的要点是,当ajax响应完成时,一些本地代码会知道它已完成并将一个事件放入JS队列中。
如果当时没有Javascript正在运行,该事件将立即触发,这将运行ajax响应处理程序。如果当时正在运行某个事件,那么当前执行的JavaScript线程完成时,事件将得到处理。这不需要JavaScript引擎的任何轮询。当一段JavaScript完成执行时,JS引擎只检查事件队列以查看是否还有其他需要运行的事件。如果是这样,它会将下一个事件从队列中弹出并执行(调用一个或多个为该事件注册的回调函数)。如果事件队列中什么都没有,那么JS解释器会有空闲时间(垃圾收集或空闲),直到某个外部代理将其他事物放入事件队列并再次唤醒为止。
由于所有外部事件都会经过事件队列,并且在JavaScript实际运行其他事情时不会触发任何事件,因此它保持单线程状态。
这里有一些细节的文章:
- How Javascript Timers Work - written by John Resig
- Events and Timing in Depth
- W3 spec: HTML5 event loops
- MDN article on Event Loop
- Presentation on JS event queue
- The JavaScript Event Loop: Explained
- Five Patterns to Help Tame Asynchronous Javascript
- Javascript Event Loop Presentation
- Video Discussing How Javascript Works (including event loop at 10:27)
好的答案。参考文献将使它成为一个很好的答案:) – Jeff
添加参考。 – jfriend00
谢谢你。我怀疑是这样,但很确定。我有一个for循环,其中我发出了很多'ajax'请求。在我的处理程序中(对于每个请求 - 以任意顺序返回),我运行一些可能需要一些时间的代码。很高兴知道这应该肯定工作。 – iPadDeveloper2011
- 1. 后台处理响应iOS
- 2. 如何处理Ajax响应与MVC4
- 3. jquery ajax - 如何处理json响应
- 4. 如何使用jquery处理ajax响应?
- 5. 处理AJAX成功响应
- 6. Rails 3,处理ajax响应
- 7. 未处理AJAX响应
- 8. JQuery的Ajax响应处理
- 9. 在这种情况下,应如何处理rails ajax响应?
- 10. 在AJAX中处理增量服务器响应(在JavaScript中)
- 11. 在循环处理AJAX响应
- 12. 用Javascript处理JSON响应
- 13. AIOHTTP:快速响应POST,但在后台处理其数据
- 14. 如何在jquery ajax中处理204响应?
- 15. 如何在Flux架构中处理ajax请求响应?
- 16. 在java中的httppost后处理响应
- 17. 如何使用javascript在后台运行批处理文件
- 18. 如何在后台处理叫做onload的javascript函数?
- 19. 处理对Ajax请求的响应
- 20. JQUERY的getJSON/AJAX未被处理响应
- 21. Ajax响应处理不是Firefox下
- 22. 无法处理原型Ajax响应
- 23. jquery ajax数组响应处理
- 24. 处理多个Ajax请求和响应
- 25. 如何在java中处理json响应?
- 26. 将Javascript事件处理程序绑定到Ajax HTML响应?
- 27. 使JavaScript事件处理函数依赖于AJAX响应
- 28. 如何在ajax调用响应后更新响应es6组件?
- 29. 响应处理
- 30. 处理302响应代码的Ajax响应
一个很不错的描述在这里:http://stackoverflow.com/questions/2914161/ajax-multi-threaded –
JavaScript代码是单线程的(web工作者除外),但不是运行JavaScript引擎的浏览器... –
@JuanMendes当事件队列在另一个线程中运行时,JavaScript是否在一个线程中运行? –