JavaScript: XMLHTTPREQUEST случайно застрял на готовности состояния 1

StackOverflow https://stackoverflow.com/questions/4401608

Вопрос

Я работал над гаджетом Windows (что означает «браузер» - это Internet Explorer), что запрашивает указанные адреса подсети для информации. Теперь иногда это делает это в относительно быстрой темпе (примерно каждые 5 секунд), и он работает достаточно хорошо. Однако иногда он застрял на готовности 1 и просто останется там навсегда. Всякий раз, когда гаджет пытается переделать функцию для получения XMLHTTTTREQUEST и получения информации от нее, она останется в состоянии 1. Это легко репливируется при открытии нескольких экземпляров гаджета, а затем закрытие всего, кроме одного из них. В этот момент тот, который все еще открыт, почти всегда застрял в этом состоянии. Я чувствую, что у него может быть что-то связано с ними все доступ к одному и тому же саму, или он может просто связаться с XMLHTTTREQUESTS, которые останавливают среднюю передачу, и это предотвращает работу другого. Ниже приведен соответствующий код.

//Reference to this for the inner function
var me = this;
var request = new XMLHttpRequest();
request.onreadystatechange = onReadyStateChange;
var url = this.url;
//Make the URL random to prevent being cached
url += ("&a=" + ((new Date()).getTime()));
Trace(DEBUG_COMM, "Sase.updateStatus url: " + url);
request.open("GET", url, true);
request.send();   // fire off the request, calls httpRequestReadyStateChange as things continue
Trace(DEBUG_COMM, "Request sent" + request.readyState); 
function onReadyStateChange() {Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: state=" + request.readyState);
    if (4 == request.readyState) {
        Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: status=" + request.status);

        if (request.status == 200) {
            Trace(DEBUG_COMM, "retrieved html: " + request.responseText);
            var results = request.responseText;
            var resultsString = request.responseText.toString();
            Trace(DEBUG_COMM, "results String: " + resultsString);
            me.ParseStatusData(resultsString);
        }
        else {
            //me.commError(request.status);
        }

        request = null;
    }
}
Это было полезно?

Решение

Ну, похоже, я понял это. У меня было ощущение, что это неразрешенная просьба, поскольку оно происходит только тогда, когда экземпляры его закрыты (что означает, что если один из них закрыт во время связи с сервером, он остается в общении навсегда и никто не может получить доступ к серверу) и Похоже, это так. Я сделал несколько модификаций кода в нескольких областях, и в основном то, что находится в том, что гаджет закрывается, он не должен прервать все запросы. Запросы сейчас являются переменными экземпляра (чтобы разрешить прергать их), но все еще сделаны новыми каждый раз, когда они необходимы.

Другие советы

Для тех, кто наткнулся на это и нуждается в примере конкретного кода, здесь вы идете.

У меня была та же проблема, и решение было повторно использовать объект XMLHTTPREQUEST, чтобы убедиться, что любой предыдущий запрос был отменен перед началом нового. Это не будет работать, если вы хотите иметь несколько запросов AJAX, летающие, но в моем случае запускается новый запрос, означал, что последний больше не нужен.

Все запросы на моей странице прошли один и тот же метод XMLHTTPREQUEST, который выглядел так;

//Declare the XMLHttpRequest object to be re-used
var global_xHttpRequest = null;

function xmlHttpHandler(type, params, complete, postData) {

   //Prevents an issue where previous requests get stuck and new ones then fail
   if (global_xHttpRequest == null) {
       global_xHttpRequest = new XMLHttpRequest();
   } else {
       global_xHttpRequest.abort();
   }

   //Parse out current URL
   var baseURL = window.location.host;
   var svc = "https://" + baseURL + "/processAction?";

   var url = svc + params;

   global_xHttpRequest.open(type, url, true);

   //Add the callback
   global_xHttpRequest.onreadystatechange = complete;

   global_xHttpRequest.send(postData);
}

Которые можно использовать следующим образом:

   xmlHttpHandler("GET", params, completeFnc);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top