这是我的示例代码。 (我需要发送同步请求的原因是实际上我需要发送多个请求,每个请求都取决于先前请求的响应。我需要设置回调的原因是我想显示一些微调器,因此用户知道状态脚本。)
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()需要很长时间)
谢谢!
答案 0 :(得分:1)
如果XHR是同步的,则在.send()
返回之前执行回调。换句话说,在blablabla()
。
浏览器DOM更新是异步的。或者更确切地说,重绘是异步的(DOM更新/重排有时可以是同步的,但它不会绘制到屏幕,只是更新数据结构)。
因此,即使您坚持不学习如何使用同步XMLHttpRequest编写异步程序,也无法同步绘制任何内容。你最好把所有东西写成异步。
注意:要清楚,只有当javascript解释器没有其他内容可以运行时才会重绘。换句话说,浏览器窗口只会在blablabla()
完成运行后更新。
如果blablabla()
需要很长时间才能执行,您可以使用setTimeout()
分解循环以使其异步。或者,您可以尝试使用网络工作者。