xmlhttp запрос имеет странное поведение и имеет статус = 0 - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть расширение Google Chrome, которое при нажатии кнопки выполняет запрос xmlhttp на сервер. В настоящее время я обрабатываю ошибку, если сервер не работает. Чего я хочу добиться - это повторить запрос через большее количество секунд. Вот как я это делаю:

var execute = function(method, url, i){
            //if timeout doesn't exist, create one
            if(!i){
                i = 1000;
            }

            var xmlhttp = new XMLHttpRequest(); 
            xmlhttp.open(method, url, true);

            xmlhttp.onreadystatechange = function(){
                if (xmlhttp.status != 200)  {
                    // Handle error, retry request
                    console.log("xmlhttp.status = " + xmlhttp.status + " and xmlhttp.readyState = " + xmlhttp.readyState);
                    setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i);
                    return;
                }
            };

            xmlhttp.send(null);
        }

Обычно, если возникает какая-то проблема, я повторяю запрос еще раз. Если сервер работает, проблем вообще нет, но если сервер не работает, JavaScript выдает сообщение об ошибке:

PUT http://localhost:3000/buy/2/id=1329664820124 
executepopup.html:127
(anonymous function)

Что на самом деле не имеет смысла, но как бы то ни было. Статус в журнале говорит "0", что тоже довольно неубедительно. Если я снова включаю сервер во время этого процесса, он должен прекратить это делать, но вместо этого также, если это происходит успешно (я вижу журнал на сервере, который сообщает мне, что он получил запрос), он продолжает вызывать execute метод. Я не знаю, как остановить эту рекурсию, если сервер включается. Я делаю что-то неправильно? Является ли это состояние равным нулю проблема?

Большое спасибо

1 Ответ

4 голосов
/ 19 февраля 2012

Решение проблемы

onreadystatechange срабатывает при каждом изменении состояния, от состояния 0 до 4 и много раз между.Вы должны быть заинтересованы только в readyState 4, потому что на этом этапе запрос полностью завершен.Чтобы ваш метод заработал, проверьте, xmlhttp.readyState == 4:

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status != 200)  {

Исправление вашей ужасной реализации setTimeout

setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i); - это , а не правильный способ вызова функции снова.Поскольку вы разрабатываете расширение Chrome, вы можете использовать следующий формат для setTimeout:

setTimeout(execute, i, method, url, i*2);
// Calls execute(method, url, i*2) after i milliseconds.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...