【发布时间】:2016-05-16 10:22:36
【问题描述】:
我知道 javascript 在单线程上运行。我也知道,当我们使用 jquery 进行异步 ajax 调用时,代码不会停止并继续串行执行。响应由回调处理。我的问题是单线程如何做到这一点? 当我们得到响应时,线程是否处理回调并停止进一步的代码执行?
【问题讨论】:
-
here 有一个很好的答案,包括很多参考资料。
我知道 javascript 在单线程上运行。我也知道,当我们使用 jquery 进行异步 ajax 调用时,代码不会停止并继续串行执行。响应由回调处理。我的问题是单线程如何做到这一点? 当我们得到响应时,线程是否处理回调并停止进一步的代码执行?
【问题讨论】:
不,它不会停止代码执行。
回调被排队,当没有其他要执行的时候,它就会运行。
没有两件事同时发生,调度也不是抢先的。
因此,如果您让单线程忙于诸如无限循环之类的事情,回调将永远没有机会运行。
【讨论】:
浏览器管理一个事件队列。当事件发生时,例如来自 Ajax 调用的响应、计时器触发或鼠标或触摸事件,当主线程处于空闲状态时,就会在主线程上调用相应的回调。
【讨论】:
这并不完全是如何工作的,因为它取决于您使用的是 Node 还是浏览器以及哪个浏览器,但它是一个很好的心理模型。
JavaScript 位于另一种多线程语言(如 C)之上。当 JavaScript 运行 ajaxs 请求时,它会将请求添加到队列中,并且为处理网络请求而构建的语言会执行此操作。请求完成后,它会更改队列中的值。 在每个流程循环之后,JavaScript 将检查此队列并运行与已完成任务相关的任何回调。因此 JavaScript 本身并不执行该过程,而只是检查它们何时完成。
【讨论】: