【问题标题】:when will callback for synchronous xmlHttpRequest calls get executed?同步 xm​​lHttpRequest 调用的回调何时执行?
【发布时间】:2015-06-16 11:22:16
【问题描述】:

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

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) TIAS! 2) 不,但是您可以将 blablabla() 拆分为多个函数,使用短计时器的回调从一个到下一个。
  • 为什么在同步请求中使用回调?你为什么要使用 SJAX? (这就是为什么你的颜色变化不起作用的原因)
  • 我使用回调是因为我想显示一些微调器,以便用户知道脚本的状态。我需要发送同步请求,因为实际上我需要发送多个请求,每个请求取决于前一个请求的响应。

标签: javascript xmlhttprequest


【解决方案1】:
  1. 如果 XHR 是同步的,则回调会在 .send() 返回之前执行。换句话说,在blablabla()之前。

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

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


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

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

【讨论】:

  • 我需要发送同步请求的原因是实际上我需要发送几个请求,每个请求取决于前一个请求的响应。我需要设置回调的原因是我想显示一些微调器,以便用户知道脚本的状态。
  • @user3462510:有关如何管理多个异步请求的示例,请参阅:stackoverflow.com/questions/4631774/… 和此:stackoverflow.com/questions/13250746/…。第二个答案可用于处理网络爬虫等一系列相关请求。
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2014-11-21
  • 2016-05-03
  • 2011-08-22
相关资源
最近更新 更多