如何强制程序等待HTTP请求在JavaScript中完成?

Tha*_*sas 18 javascript xmlhttprequest httprequest wait

有没有办法在JavaScript中向HTTP服务器发送HTTP请求并等待服务器响应回复?我希望我的程序等到服务器回复,而不是执行此请求之后的任何其他命令.如果HTTP服务器关闭,我希望在超时之后重复HTTP请求,直到服务器回复,然后程序的执行可以正常继续.

有任何想法吗?

提前谢谢你,Thanasis

Jav*_*ome 30

有一个第三个参数来XmlHttpRequestopen(),其目的是表明你想要的请求通过异步(等处理通过响应onreadystatechange处理程序).

因此,如果您希望它是同步的(即等待答案),只需为第3个参数指定false.timeout在这种情况下,您可能还想为您的请求设置一个有限的属性,因为它会阻止页面直到接收.

这是同步和异步的一体化示例函数:

function httpRequest(address, reqType, asyncProc) {
  var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
  if (asyncProc) { 
    req.onreadystatechange = function() { 
      if (this.readyState == 4) {
        asyncProc(this);
      } 
    };
  } else { 
    req.timeout = 4000;  // Reduce default 2mn-like timeout to 4 s if synchronous
  }
  req.open(reqType, address, !(!asyncProc));
  req.send();
  return req;
}
Run Code Online (Sandbox Code Playgroud)

您可以这样称呼:

var req = httpRequest("http://example.com/aPageToTestForExistence.html", "HEAD");  // In this example you don't want to GET the full page contents
alert(req.status == 200 ? "found!" : "failed");  // We didn't provided an async proc so this will be executed after request completion only
Run Code Online (Sandbox Code Playgroud)

  • 我今天第一次尝试同步请求,因为我和 OP 有类似的需求。很惊讶收到投诉(在 Chrome 上)说:“InvalidAccessError: Failed to execute 'open' on 'XMLHttpRequest': Synchronous requests must not set a timeout.”。考虑到同步请求的性质,这样的限制似乎很疯狂,但这就是结果。奇怪的! (3认同)

jwu*_*ler 9

您可以执行同步请求.jQuery示例:

$(function() {
    $.ajax({
       async: false,
       // other parameters
    });
});
Run Code Online (Sandbox Code Playgroud)

你应该看一下jQuery的AJAX API.我强烈建议使用像jQuery这样的框架.手动做跨浏览器的ajax真是太痛苦了!

  • 亚力克斯,那是我!我是其中之一!;) (5认同)

Ash*_*iya 6

您可以使用XMLHttpRequest对象发送您的请求.发送请求后,您可以检查readyState属性以识别当前状态.readyState将具有以下不同的状态.

  • 未初始化 - 尚未开始加载
  • 正在加载 - 正在加载
  • 交互式 - 已加载足够,用户可以与之交互
  • 完成 - 满载

例如:

xmlhttp.open("GET","somepage.xml",true);
xmlhttp.onreadystatechange = checkData;
xmlhttp.send(null);

function checkData()
{
    alert(xmlhttp.readyState);
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助

  • 我希望程序的执行是串行的,我不想使用回调.我想尽可能在​​"xmlhttp.send(null);"停止执行程序 在请求完成后调用然后继续. (2认同)