Браузер ожидает завершения вызова ajax даже после вызова прерывания (jQuery)
-
06-09-2019 - |
Вопрос
У меня есть несколько (потенциально) длительных вызовов ajax, которые я хотел бы прервать, если пользователь перейдет на другую страницу.Следующий код jQuery вызывает отмену всех ожидающих объектов XMLHttpRequest при выходе со страницы:
$.ajaxSetup({
beforeSend: function(xhr) {
$(window).bind('beforeunload', function() {
xhr.abort();
});
}
});
В тестовом примере я заставляю 10-секундное ожидание вызываемой серверной операции.Используя Firebug, я подтвердил, что приведенный выше код действительно приводит к немедленной остановке всех ожидающих вызовов ajax, когда я нажимаю любую ссылку на странице.Однако браузер по-прежнему ждет полные 10 секунд, прежде чем перейти к следующей странице.IE, похоже, демонстрирует такое же поведение.Это известное поведение браузера?Могу ли я что-нибудь сделать, чтобы позволить пользователю немедленно уйти со страницы в этой ситуации?Заранее спасибо.
Решение
Спасибо за ваши ответы!Оказывается, я совершенно ошибался, считая, что это проблема браузера — проблема была на сервере.ASP.NET сериализует запросы одного и того же сеанса, для которых требуется состояние сеанса, поэтому в этом случае обработка следующей страницы на сервере не начнется до тех пор, пока не завершатся запросы, инициированные ajax.
К сожалению, в этом случае состояние сеанса требуется в обработчике http, который ответил на вызовы ajax.Но доступ только для чтения достаточно хорош, поэтому, пометив обработчик с помощью IReadOnlySessionState вместо IRequiresSessionState, блокировки сеанса не будут удерживаться и проблема будет решена.
Надеюсь, эта информация окажется полезной для других.
Другие советы
Что касается собственного ответа Тодда на этот вопрос...
У меня только что возникла проблема с PHP, и то же решение сработало бы.Однако мне нужна была информация на сеансе.Для разработчиков PHP вы можете позвонить session_write_close()
закрыть и записать сеанс в середине запроса.Это освободит сеанс для других запросов.
Возможно, вы захотите проверить странный побочный эффект abort().
При использовании метода abort() в Explorer и Mozilla срабатывает событие Readystatechange.Хуже того, ReadyState = 4, что означает, что средний сценарий xmlhttp предполагает, что данные загружены правильно.Это может дать очень странные эффекты.
задокументировано здесь:
http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html
Вы уверены, что используете асинхронный запрос?Если браузер блокируется во время всего запроса, вы используете синхронный запрос (параметр async имеет значение false)
Проблема с сервером также касается сервера Apache/Php, с которым я работаю.Удален session_start для скрипта, которому он не нужен (AJAX), и все работает как положено.Спасибо Тодду, который указал на подобную проблему!
Ссылка на принятый ответ:
http://improve.dk/optimizing- Performance-programmatically-setting-readonlysessionstate/
О IRequiresSessionState
Это означает, что для данного сеанса одновременно может выполняться только один запрос.Любые другие запросы из того же сеанса будут заблокированы в ожидании освобождения сеанса.