简体   繁体   English

使用Javascript向服务器发送多个请求,直到服务器返回200

[英]Use Javascript to send multiple requests to server until server returns 200

I have created a html page which the user views when they are waiting for another application to restart. 我创建了一个html页面,用户在等待另一个应用程序重新启动时可以查看该页面。 I have created a javascript script which makes multiple requests to the application until the application returns 200. However, when i try to open my html page, the browser simply crashes. 我创建了一个JavaScript脚本,该脚本向应用程序发出多个请求,直到应用程序返回200。但是,当我尝试打开html页面时,浏览器便崩溃了。 Can anyone see whats wrong with my code: 谁能看到我的代码有什么问题:

var responseStatus = 404;
var numberOfTries = 0;
var request = new XMLHttpRequest(); 
while(responseStatus != 200){
    console.log("Checking if restart has completed. Attempt number: " + numberOfTries);
    request.open('GET', 'applicationurl', true);
    request.onreadystatechange = function(){
        if (request.readyState === 4){
            console.log("Request Status: " + request.status);
            responseStatus = request.status;
            console.log("Response Status: " + request.status);
            if (request.status != 200) {  
                numberOfTries++;
                console.log("Restart has not yet completed! NumberOfTries: " + numberOfTries);
            }  
        }
    };
    request.send();
}
console.log("Server has successfully restarted");

The best way to do this (in my opinion) is to actually combine @serge1peshcoff's two options. 最好的方法(我认为)是将@ serge1peshcoff的两个选项结合起来。 Write the call as a function that calls itself when the response fails, and set a timeout when doing so. 将调用编写为在响应失败时会自行调用的函数, 并在设置超时时设置超时。 For most purposes, you don't want to send another request immediately after the previous one, you want to wait at least a second or five to prevent spamming the server (you've also given no indication of how many clients you expect. What's bad for your browser is potentially horrible for the server, which may be handling requests even before your web app is fully up and returning 200). 在大多数情况下,您不想在上一个请求之后立即发送另一个请求,而是要等待至少一秒钟或五分钟,以防止服务器发送垃圾邮件(您也没有指出期望的客户端数量。对您的浏览器造成的危害可能会对服务器造成可怕的影响,甚至在您的Web应用程序完全启动并返回200之前,服务器就可能正在处理请求。

Also, setTimeout is a better approach than setInterval, as you explicitly reset it on each round trip. 同样,setTimeout是比setInterval更好的方法,因为您在每次往返时都将其明确重置。

Borrowing from @serge: 从@serge借来的:

function tryRequest(numTries) {
  var responseStatus = 404;
  var request = new XMLHttpRequest(); 
  numTries = numTries || 0;

  console.log("Checking if restart has completed. Attempt number: " + numAttempts);
  request.open('GET', 'applicationurl', true);
  request.onreadystatechange = function(){
      numTries++

      if (request.readyState === 4){
          console.log("Request Status: " + request.status);
          responseStatus = request.status;
          console.log("Response Status: " + request.status);
          if (request.status != 200) {  
              console.log("Restart has not yet completed! NumberOfTries: " + this.attempts);
              setTimeout(tryRequest.bind(null, numTries), 5000); // five seconds
          }  
      }
  };
  request.send();

  console.log("Server has successfully restarted");
}
tryRequest();

Your approach sends a multiple requests, however it doesn't wait for them to respond. 您的方法会发送多个请求,但是不会等待它们响应。

Here is how it works: 下面是它的工作原理:

  • an XMLHttpRequest is created 创建一个XMLHttpRequest
  • a callback and a data is assigned to it 回调并为其分配数据
  • this object is sent to server 该对象发送到服务器
  • then the while loop ends and runs again, not waiting for the callback to be run 然后while循环结束并再次运行,而不是等待回调运行

As a result, a lot of XMLHttpRequest objects are created and a lot of requests are run simultaneously, which is not what you want. 结果,创建了许多XMLHttpRequest对象,并且同时运行了许多请求,这不是您想要的。

You can do this 2 ways: 您可以通过以下两种方式执行此操作:

  • wrapping it into a function and call it when it fails (preferrable); 将其包装到函数中,并在失败时调用(最好);
  • setting some interval to wait for response 设置间隔以等待响应

1st approach: 第一种方法:

function tryRequest(numAttempts) {
  var responseStatus = 404;
  var request = new XMLHttpRequest(); 

  console.log("Checking if restart has completed. Attempt number: " + numAttempts);
  request.open('GET', 'applicationurl', true);
  request.onreadystatechange = function(){
      if (request.readyState === 4){
          console.log("Request Status: " + request.status);
          responseStatus = request.status;
          console.log("Response Status: " + request.status);
          if (request.status != 200) {  
              console.log("Restart has not yet completed! NumberOfTries: " + numAttempts);
              tryRequest(numAttempts + 1)
          }  
      }
  };
  request.send();

  console.log("Server has successfully restarted");
}
tryRequest(0);

2nd approach: 第二种方法:

var responseStatus = 404;
var numberOfTries = 0;
var request = new XMLHttpRequest();
var interval = setInterval(tryRequest, 1000)

function tryRequest() {
  console.log("Checking if restart has completed. Attempt number: " + numberOfTries);
  request.open('GET', 'applicationurl', true);
  request.onreadystatechange = function(){
      if (request.readyState === 4){
          console.log("Request Status: " + request.status);
          responseStatus = request.status;
          console.log("Response Status: " + request.status);
          if (request.status != 200) {
              numberOfTries++;
              console.log("Restart has not yet completed! NumberOfTries: " + numberOfTries);
          } else {
              clearInterval(interval);
              console.log("Server has successfully restarted");
          }
      }
  };
  request.send();
  }

}

(disclaimer: I didn't test both of then) (免责声明:那时我都没有测试)

You can use Code like 您可以使用类似的代码

var responseStatus = 404;
var numberOfTries = 0;
function check(){
        var request = new XMLHttpRequest(); 
        console.log("Checking if restart has completed. Attempt number: " + numberOfTries);
        request.open('GET', 'applicationurl', true);
        request.onreadystatechange = function(){
            if (request.readyState === 4){
               console.log("Request Status: " + request.status);
               responseStatus = request.status;
               console.log("Response Status: " + request.status);
               if (request.status != 200) {  
                  numberOfTries++;
                  console.log("Restart has not yet completed! NumberOfTries: " + numberOfTries);
                   var tmp = setTimeout(function(){ check() },5000 ); // check after 5 second
               }  elseif (request.status == 200) {  
                    console.log("Server has successfully restarted");
               }
            }
        };
        request.send();

  }

// Call first time //第一次通话

check();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM