我知道有类似的话题,但我找不到以下问题的答案。为什么第一段代码执行回调而第二段没有执行回调。
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) {
}
在上面的代码中打印Request is ready
。但是使用以下代码:
setTimeout(function () {
console.log("Test")
}, 5)
while (1 < 5) {
}
Test
未打印。为什么会这样?我认为onreadystatechange
会在请求准备就绪时执行此函数,但由于我们有一个无限循环,因此looper不会检查队列(因为looper在主线程上循环并且它正忙)。这个逻辑适用于第二个例子,但不适用于第一个例子。显然我错过了一些东西。
提前致谢。
答案 0 :(得分:2)
第一种情况下没有异步事件:open
触发第一次状态更改,同步调用onreadystatechange
回调。
{<1}}日志在>>输入循环之前完成。
如果添加"Request is ready"
并调用非缓存网址,则会注意到其他更改未调用回调,因为这些更改实际上是异步的。