什么时候回调同步xmlHttpRequest调用会被执行?

时间:2015-06-16 00:12:26

标签: javascript xmlhttprequest

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

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 个答案:

答案 0 :(得分:1)

  1. 如果XHR是同步的,则在.send()返回之前执行回调。换句话说,在blablabla()

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

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

    注意:要清楚,只有当javascript解释器没有其他内容可以运行时才会重绘。换句话说,浏览器窗口只会在blablabla()完成运行后更新。

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