Подтвердить что ты не робот

Браузер ждет, когда вызов ajax завершится, даже после того, как был вызван прерывание (jQuery)

У меня есть (потенциально) длительные вызовы ajax, которые я хотел бы прервать, если пользователь перейдет на другую страницу. Следующий код jQuery вызывает прерывание во всех ожидающих объектах XMLHttpRequest при навигации от страницы:

$.ajaxSetup({
    beforeSend: function(xhr) {
        $(window).bind('beforeunload', function() {
            xhr.abort();
        });
    }
});

В тестовом примере я вызываю 10-секундное ожидание при вызове на стороне сервера. Используя Firebug, я подтвердил, что приведенный выше код действительно заставит все ожидающие вызовы ajax останавливаться немедленно, когда я нажимаю любую ссылку на странице. Тем не менее, браузер все еще ждет 10 секунд, прежде чем перейти к следующей странице. Похоже, что IE проявляет такое же поведение. Это известное поведение браузера? Есть ли что-нибудь, что я могу сделать, чтобы позволить пользователю мгновенно перейти от страницы в этой ситуации? Спасибо заранее.

4b9b3361

Ответ 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

Это означает, что для данного сеанса одновременно может выполняться только один запрос. Любые другие запросы, начиная с того же сеанса, будут блокироваться, ожидая выхода сеанса