Перезагрузка страницы во время выполнения Ajax-запроса дает пустой ответ и статус как ноль - PullRequest
3 голосов
/ 17 ноября 2010

Браузер Firefox 3.0.10. Я запрашиваю страницу, используя Ajax. Ответ в процессе может быть в ReadyState менее 4. Тем временем я пытаюсь перезагрузить страницу. Запрос заканчивается, давая пустой ответ.

Я использовал оповещение, чтобы найти строку, которая была задана в качестве текста ответа. Я предполагаю, что к этому времени состояние готовности 4 достигнуто. Почему это пустая строка?

Когда я оповещаю xmlhttpobject.status, он отображает 0.

Когда я предупреждаю xmlhttpobject.statusText об исключении, появляется сообщение «НЕДОСТУПНО».

Когда я читаю в документе http://www.devx.com/webdev/Article/33024/0/page/2, он говорит, что доступны 3 и 4 status и statusText, но при тестировании доступен только статус, но не satausText.

Вот пример кода.

Считайте, что я запросил страницу, и моя функция обратного вызова выглядит следующим образом

function cb(rt)
{
   if(rt.readyState==4)
   {
      alert(rt.status);
      alert(rt.statusText); // which throws an exception
   }
}

и мой серверный скрипт выглядит следующим образом

sleep(30);
//flushing little drop down code

Помимо этого, я заметил следующее.

Предположим снова, что я запрашиваю приведенный выше скрипт, используя Ajax. Теперь будет простоя 30 секунд. Перед этим 30 секунд я нажимаю обновить. Я получил xmlhttpobject.status as, 0, но браузер все еще не перезагружал страницу в течение этих 30 секунд. Почему?

Когда я обновляю страницу до завершения Ajax-запроса, значение состояния устанавливается равным нулю, а состояние готовности устанавливается равным 4, но страница все еще ожидает ответа от сервера до конца.

Что происходит?

ПРИЧИНА ДЛЯ МЕНЯ, ЧТОБЫ ВИДЕТЬ НЕКОТОРОЕ, КАК ЭТО ТАК КАК СЛЕДУЕТ.

Всякий раз, когда я делаю Ajax-запрос, если процесс завершается успешно, например, вставкой чего-либо или удалением чего-либо, я выскакиваю div, сообщающий, что он успешно обновился, и я перезагружаю страницу. Но если возникает какая-либо ошибка, я не перезагружаю страницу, а просто предупреждаю, что не смог обработать этот запрос.

Если пользователь перезагружает страницу до того, как какой-либо из этих запросов будет выполнен, я получаю пустой ответ, который в моих вычислениях указывает на ошибку сервера. Поэтому я отлаживал ответ Ajax, чтобы отфильтровать, что соединение было прервано, потому что пользователь нажал перезагрузить. Поэтому на этот раз я не хочу отображать «невозможно обработать этот запрос», когда пользователь перезагружает страницу до того, как запрос будет завершен.

О ... длинная история. ЭТО ДЛИННОЕ ОПИСАНИЕ, ЧТО Я МОГУ СДЕЛАТЬ ЭКСПЕРТАМИ, ПОНИМАТЬ МОЕ СОМНЕНИЕ.

Итак, что я хочу из вышеперечисленного.

Любой тип ответа очистит мой разум. Или я хотел бы сказать все типы ответов.

РЕДАКТИРОВАТЬ: 19 дек. Если я не получу правильного ответа, я удалю этот вопрос и перепишу с примерами. Остальное я приму после экспериментов.

Я создам демонстрационную программу и опубликую ссылку здесь, чтобы я мог понять, с чем я столкнулся. Сегодня 29 декабря 2010 года.

Ответы [ 5 ]

6 голосов
/ 25 декабря 2010

Это никак не связано с версией браузера.

В тот момент, когда браузер обнаруживает изменение страницы (например, перезагрузку), он прерывает все XHR вызовы. Каждый браузер делает это. И это достойная вещь.

У меня такой вопрос: почему вы перезагружаете страницу, когда / когда работает ajax-запрос?

Мое решение было бы: отслеживать все запросы ajax и прерывать их «вручную» (да, вы можете сделать это: https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#abort() при выходе из страницы (onunload или onbeforeunload).

1 голос
/ 30 сентября 2012

У меня была такая же проблема, она оказалась проблемой с сессией PHP. Если сеанс открыт, все остальные запросы из того же сеанса должны ждать.

Чтобы исправить это, убедитесь, что вы не запускаете новый сеанс в своих серверных сценариях.

Это может быть проблемой, если вы используете какой-то фреймворк и он запускает сеанс автоматически. В этом случае просто добавьте эту строку в начале всех ваших длинных серверных сценариев опроса:

session_write_close();
1 голос
/ 24 декабря 2010

Вы используете довольно старую версию Firefox там.3.0.10 вышел полтора года назад.С тех пор многое изменилось.Есть некоторые старые ошибки Mozilla и Firefox по этому поводу.Они закрыты, и похоже, что они были закрыты, когда Firefox 3 был в бета-версии, но вы никогда не знаете, возможно, произошла регрессия.Это одна из возможностей: https://bugzilla.mozilla.org/show_bug.cgi?id=511383

Итак, я думаю, что это происходит.Я подозреваю, что при перезагрузке любой открытый http-запрос будет прерван.Исторически сложилось так, что Firefox не слишком хорошо обрабатывал прерывание - я думаю, что они собираются, чтобы readyState был равен 0, но в процессе он проходит через 4.

Я рекомендую вам (и вашим пользователям) обновить Firefoxесли возможно.Если это невозможно, вам придется как-то обойти это.Тестирование состояния == 0 и предотвращение срабатывания вашего оповещения - это то место, с которого стоит начать.Вы также можете установить флаг в событии onBeforeUnload окна.

0 голосов
/ 18 сентября 2017

Я столкнулся с той же проблемой (в Chrome), и мне кажется, что когда я нажимаю кнопку Обновить в середине запроса xhr, браузер воспринимает это как ошибку. Поэтому, если мы указали блок ошибки в нашем вызове $.ajax, браузер отобразит это как ошибку.

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

0 голосов
/ 20 июня 2012

У меня тоже есть та же проблема, и позвольте мне поделиться с вами тем, что я сделал, чтобы она заработала.Я задал параметр global:false при создании запроса ajax.Таким образом, даже если мы перейдем на любую другую страницу с запросом ajax на лету, она запустит эту страницу по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...