Javascript: xmlhttprequest случайно застрял в состоянии готовности 1 - PullRequest
0 голосов
/ 09 декабря 2010

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

//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;
    }
}

Ответы [ 2 ]

1 голос
/ 09 сентября 2015

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

У меня была та же проблема, и решение состояло в том, чтобы повторно использовать объект 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);
1 голос
/ 10 декабря 2010

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

...