由于 JavaScript 在单线程中运行,因此发出 AJAX 请求后,后台实际上会发生什么?我想更深入地了解这一点,有人能解释一下吗?
最佳答案
在底层,JavaScript 有一个事件队列。每次 javascript 线程执行完成时,它都会检查队列中是否还有另一个事件需要处理。如果有,它将其从队列中拉出并触发该事件(例如,单击鼠标)。
位于 ajax 调用下的 native 代码网络将知道 ajax 响应何时完成,并且事件将添加到 JavaScript 事件队列中。 native 代码如何知道 ajax 调用何时完成取决于实现。它可以用线程实现,也可以是事件驱动本身(这并不重要)。实现的要点是,当 ajax 响应完成时,一些 native 代码会知道它已完成并将事件放入 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)
关于javascript - JavaScript 如何在后台处理 AJAX 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28335801/