当javascript是单线程时,它如何在请求后接收回调?

当javascript是单线程时,它如何在请求后接收回调?,javascript,asynchronous,Javascript,Asynchronous,我知道也有类似的话题,但我找不到以下问题的答案。为什么第一段代码执行回调而第二段代码不执行回调 var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; var xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = function () { console.log("Request is ready"); } xmlHttp.open("GET", "

我知道也有类似的话题,但我找不到以下问题的答案。为什么第一段代码执行回调而第二段代码不执行回调

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
    console.log("Request is ready");
}
xmlHttp.open("GET", "www.google.com", true);

var result = 0;

while(1 < 5) {
}
测试
未打印。为什么会这样?我认为,
onreadystatechange
将在请求准备就绪时推动此函数执行,但由于我们有一个无限循环,循环器不会检查队列(因为循环器在主线程上循环,并且它很忙)。此逻辑适用于第二个示例,但不适用于第一个示例。很明显我错过了什么


提前感谢。

在第一种情况下没有异步事件:
open
触发第一个状态更改并同步调用
onreadystatechange
回调

“请求准备就绪”
日志在进入循环之前完成


如果添加
xmlHttp.send
并调用非缓存URL,您会注意到其他更改不会调用回调,因为这些更改实际上是异步的。

True。onreadystatechange事件将仅为第一次更改调用。其他呼叫,例如,当请求完成时,您将不会收到其他事件。非常感谢。但我仍然认为,在当前所做的工作完成后,此更改会发送到队列。显然我是不对的。所以我想,当调用open时,它会将要执行的操作发送到队列,但不会立即执行该操作?@DPM是的,事件队列不会用于第一次更改。最近的API在处理事件的方式上更加一致,规则是可以异步的东西必须始终是异步的(参见示例)。在旧时代,许多开发人员认为,出于性能原因,最好避免回调队列(例如,jQuery最近刚刚被修复为deferred总是异步解析)。
    setTimeout(function () {
    console.log("Test")
    }, 5)

    while (1 < 5) {

   }