XmlHttpRequest возвращает состояние 4 слишком рано - PullRequest
0 голосов
/ 09 апреля 2011

Я разрабатываю код JavaScript для запуска на встроенном устройстве с помощью браузера ANT Galio.

В идеале я хотел бы, чтобы код отправлял запрос на получение на другой сервер.После того, как этот запрос get сделан, страница не позволит пользователю отправить другой запрос get, пока не будет получен ответ от предыдущего запроса get.

Почему-то иногда я получаю состояние готовности 4 почти мгновенно.Как будто он оценивает предыдущий объект XmlHttpRequest, а не новый.Что я делаю не так?

 <script type="text/javascript">

var fail= function (env, resp, stat) {

        alert(resp);
};
var succ= function (env, resp) {
};

var canScan = true;

/* start scan */
function scan (name) {
        if (canScan) {
                //deactivate button
                deactivateScanButtons();
                //let server know
                ajax = new XMLHttpRequest();
                var scanUrl = 'http://19X.1XX.X.XX:8080/scan/' + name
                ajax.open('GET', scanUrl, true);
                ajax.onreadystatechange = function() {
                        if (ajax.readyState==4) {
                                //allow button to work again
                                activateScanButtons();
                                alert("ready state 4");


                        };
                };

                ajax.send();
//initiate scan
                xrxScanInitiateScan(
                        'http://127.0.0.1',
                        "ftp.xst",
                        false,
                        succ,
                        fail);
        }

}

function deactivateScanButtons () {
//      canScan = false;

        var indicator = document.getElementById('buttons');
        indicator.style.visibility = "hidden";
}
function activateScanButtons () {
//      canScan = true;

        var indicator = document.getElementById('buttons');
        indicator.style.visibility = "visible";

}
</script>

Ответы [ 2 ]

1 голос
/ 09 апреля 2011

3 предложения:

  1. Чтобы избежать кэширования на стороне клиента, добавьте случайно сгенерированное число или текущую метку времени в строку запроса.
  2. Как сказал Йони, инициируйтеВаш XMLHttpRequest объект с ключевым словом var.
  3. Для каждого запроса сохраняйте текущую метку времени в глобальной переменной.В onreadystatechange вызывайте activateScanButtons, только если глобальная временная метка совпадает с соответствующей временной меткой данного запроса.Таким образом, только последний запрос сможет позвонить activateScanButtons.
1 голос
/ 09 апреля 2011

Вы определяете объект ajax в функции scan без ключевого слова var перед ним. Это означает, что это глобальный объект, а не локальный. После этого у вас есть замыкание - вы обращаетесь к этой переменной в функции обратного вызова onreadystate.

Мне трудно точно отслеживать, что там происходит, но я согласен с вами, как вы сказали в своем вопросе, что обратный вызов не использует объект ajax так, как вы ожидаете. Вы говорите, что это иногда случается - это происходит, когда вы делаете два запроса почти одновременно (дважды щелкните кнопку или иным образом быстро вызовете два запроса get)?

Я предлагаю использовать ключевое слово var перед определением объекта ajax. Более того, попробуйте использовать this в функции обратного вызова вместо ссылки на объект ajax по имени. Если это работает, вы избавили себя от одного закрытия.

...