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

StackOverflow https://stackoverflow.com/questions/941889

Вопрос

У меня есть несколько (потенциально) длительных вызовов 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top