什么时候执行同步 xm​​lHttpRequest 调用的回调?

when will callback for synchronous xmlHttpRequest calls get executed?

这是我的示例代码。 (我需要发送同步请求的原因是实际上我需要发送几个请求,每个请求都取决于前一个请求的响应。我需要设置回调的原因是我想显示一些微调器,所以用户知道状态脚本。)

var xmlhttp =new XMLHttpRequest();
xmlhttp.onreadystatechange=function() { 
  if (xmlhttp.readyState==2) {
    document.getElementById("p2").style.color = "blue"; //statment 1
  }
  if (xmlhttp.readyState==4) {
    document.getElementById("p2").style.color = "red"; //statment 2
  }
}
xmlhttp.open("GET","ajax_info.txt",false);
xmlhttp.send();
balblabla();  // a time-cost function

那我有2个问题。 首先,语句 1 和语句 2 何时真正执行? 是否保证在 balblabla() 之前执行?

其次,即使执行语句 1 和语句 2,在 blablabla() 完成之前,浏览器似乎不会真正更改显示的颜色。 有没有办法在 blablabla() 完成之前显示颜色变化? (假设 blablabla() 需要很长时间)

谢谢!

  1. 如果 XHR 是同步的,那么回调会在 .send() returns 之前执行。也就是说在blablabla().

  2. 之前
  3. 浏览器 DOM 更新是异步的。或者更确切地说,重绘是异步的(DOM update/reflow 有时可以是同步的,但它不会绘制到屏幕上,只是更新数据结构)。

所以,即使你坚持不学习如何使用同步 XMLHttpRequest 编写异步程序,你也无法同步绘制任何东西。你最好异步编写所有内容。


注意:需要明确的是,重绘仅在 javascript 解释器没有其他 运行 时才会发生。也就是说,浏览器window只会在blablabla()完成运行ning后才会更新。

如果 blablabla() 需要很长时间执行,您可以使用 setTimeout() 打破循环使其异步。或者,您可以尝试使用网络工作者。