Air XmlHttpRequest time out if remote server is of

2019-05-14 14:29发布

问题:

I'm writing an AIR application that communicates with a server via XmlHttpRequest.

The problem that I'm having is that if the server is unreachable, my asynchronous XmlHttpRequest never seems to fail. My onreadystatechange handler detects the OPENED state, but nothing else.

Is there a way to make the XmlHttpRequest time out?

Do I have to do something silly like using setTimeout() to wait a while then abort() if the connection isn't established?

Edit: Found this, but in my testing, wrapping my xmlhttprequest.send() in a try/catch block or setting a value on xmlhttprequest.timeout (or TimeOut or timeOut) doesn't have any affect.

回答1:

With AIR, as with XHR elsewhere, you have to set a timer in JavaScript to detect connection timeouts.

var xhReq = createXMLHttpRequest();
xhReq.open("get", "infiniteLoop.phtml", true); // Server stuck in a loop.

var requestTimer = setTimeout(function() {
   xhReq.abort();
   // Handle timeout situation, e.g. Retry or inform user.
}, MAXIMUM_WAITING_TIME);

xhReq.onreadystatechange = function() {
  if (xhReq.readyState != 4)  { return; }
  clearTimeout(requestTimer);
  if (xhReq.status != 200)  {
    // Handle error, e.g. Display error message on page
    return;
  }
  var serverResponse = xhReq.responseText;  
};

Source



回答2:

XMLHttpRequest timeout and ontimeout is a-syncronic and should be implemented in js client with callbacks :

Example:

function isUrlAvailable(callback, error) {

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            return callback();
        }
        else {
            setTimeout(function () {
                return error();
            }, 8000);
        }
    };
    xhttp.open('GET', siteAddress, true);
    xhttp.send();
}