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

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


然后我有两个问题。
首先,语句1和2何时真正执行?
是否可以确保在balblabla()之前执行?

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

谢谢!

最佳答案

如果XHR是同步的,则在.send()返回之前执行回调。换句话说,在blablabla()之前。
浏览器DOM更新是异步的。或更确切地说,重绘是异步的(DOM更新/重排有时可以是同步的,但它不会绘制到屏幕上,而只是更新数据结构)。


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



注意:要清楚,重绘仅在javascript解释器没有其他要运行的情况下发生。换句话说,只有在blablabla()完成运行后,浏览器窗口才会更新。

如果blablabla()需要很长时间才能执行,则可以使用setTimeout()中断循环,以使其异步。另外,您可以尝试使用网络工作者。

关于javascript - 何时执行同步xmlHttpRequest调用的回调?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30856932/

10-16 19:45