Ajax呼叫不会立即发生

时间:2018-10-17 23:07:18

标签: javascript ajax

我正在观看this Youtube视频,他在视频中解释了“调用堆栈”,以及在发生Ajax调用等异步事件的情况下的事件循环。他说JavaScript执行是逐行进行的。让我们执行一个示例程序:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
    console.log(xhttp.responseText);
  }
};
xhttp.open("GET", 'https://httpbin.org/get', true);
xhttp.send();

let i = 1;
while (i < 1000000000) {
  i++;
}

console.log(i); 

因此,我的理解是JS引擎会将Ajax调用放入调用堆栈中并进行Ajax调用。由于要花费一些时间,它将回调传递给浏览器Web API,并继续执行其余代码(在本例中为while循环)。完成Ajax调用后,Web Apis将把回调放在Task Queue中。如果调用堆栈为空,事件循环将再次将回调放置在堆栈中,并执行回调。在我们的程序中,即使Ajax调用完成,我还是故意加大计数,以使Event Loop等待while循环完成。但是,当我运行上述程序时,仅在循环完成后才进行ajax调用。那么在while循环之前编写ajax调用有什么意义呢?我期望Ajax调用立即触发,但while循环完成后打印响应。我误会了吗?

1 个答案:

答案 0 :(得分:-1)

我会回答这个问题,如果其他人可以更详细地解释它或纠正我,这也是一种很好的学习经验。

AJAX =异步Javascript和XML。 名称本身说明该函数将是异步的。 根据OP链接的视频,似乎对于什么是异步代码很清楚。让我们集中讨论Javascript的“阻止”部分。

在您的示例中,该AJAX调用已添加到堆栈中,但是由于它是一个异步函数,因此它不会停止运行您的while循环的下一段代码。 while循环是同步的,因此它将停止所有操作并让while运行(这意味着您的异步现在也被阻止了)。

由于console.log()比AJAX结果的功能要快,因此它将首先打印,然后再打印http调用的结果。

src:https://www.youtube.com/watch?v=8aGhZQkoFbQ&t=412s