Браузер ждет, когда вызов ajax завершится, даже после того, как был вызван прерывание (jQuery)
У меня есть (потенциально) длительные вызовы ajax, которые я хотел бы прервать, если пользователь перейдет на другую страницу. Следующий код jQuery вызывает прерывание во всех ожидающих объектах XMLHttpRequest при навигации от страницы:
$.ajaxSetup({
beforeSend: function(xhr) {
$(window).bind('beforeunload', function() {
xhr.abort();
});
}
});
В тестовом примере я вызываю 10-секундное ожидание при вызове на стороне сервера. Используя Firebug, я подтвердил, что приведенный выше код действительно заставит все ожидающие вызовы ajax останавливаться немедленно, когда я нажимаю любую ссылку на странице. Тем не менее, браузер все еще ждет 10 секунд, прежде чем перейти к следующей странице. Похоже, что IE проявляет такое же поведение. Это известное поведение браузера? Есть ли что-нибудь, что я могу сделать, чтобы позволить пользователю мгновенно перейти от страницы в этой ситуации? Спасибо заранее.
Ответы
Ответ 1
Спасибо за ваши ответы! Оказывается, я совершенно ошибался в том, что это проблема с браузером - проблема была на сервере. ASP.NET выполняет сериализацию запросов того же сеанса, которые требуют состояния сеанса, поэтому в этом случае следующая страница не начинала обрабатывать на сервере до тех пор, пока эти запросы, инициированные ajax, не будут завершены.
К сожалению, в этом случае в обработчике HTTP, отвечающем на вызовы ajax, требуется состояние сеанса. Но доступ только для чтения достаточно хорош, поэтому, отмечая обработчик IReadOnlySessionState вместо IRequiresSessionState, блокировки сеанса не сохраняются и проблема исправлена.
Надеемся, что эта информация окажется полезной для других.
Ответ 2
В отношении Тодда собственный ответ на этот вопрос...
У меня была эта проблема с PHP, и такое же решение сработало бы. Однако мне нужна была информация на сессии. Для разработчиков PHP вы можете вызвать session_write_close()
, чтобы закрыть и выписать сеанс посередине запроса. Это освободит сеанс для других запросов.
Ответ 3
Возможно, вы захотите проверить странный побочный эффект abort()
Когда используется метод abort(), событие readystatechange запускается в Explorer и Mozilla. Хуже того, readyState = 4, что означает, что средний xmlhttp script предполагает, что данные загружены правильно. Это может принести очень странные эффекты.
задокументировано здесь:
http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html
Ответ 4
Вы уверены, что используете асинхронный запрос? Если браузер блокируется во время всего запроса, вы используете синхронный запрос (асинхронный параметр является ложным)
Ответ 5
Проблема с сервером также связана с сервером Apache/Php, с которым я работаю. Убрал session_start на script, который ему не нужен (AJAX), и все работает должным образом.
Благодаря Тодду, который указал на подобную проблему!
Ответ 6
Ссылка на принятый ответ:
http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate/
О IRequiresSessionState
Это означает, что для данного сеанса одновременно может выполняться только один запрос. Любые другие запросы, начиная с того же сеанса, будут блокироваться, ожидая выхода сеанса
Ответ 7
Для ASP.NET MVC вы можете украсить контроллер следующим [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
.
Более подробную информацию можно найти здесь... http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/