如果javascript是单线程的,请求后如何接收回调?

时间:2016-06-22 08:58:07

标签: javascript asynchronous

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

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在主线程上循环并且它正忙)。这个逻辑适用于第二个例子,但不适用于第一个例子。显然我错过了一些东西。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

{<1}}日志在>输入循环之前完成

如果添加"Request is ready"并调用非缓存网址,则会注意到其他更改未调用回调,因为这些更改实际上是异步的。