Браузер ожидает завершения вызова ajax даже после вызова abort (jQuery) - PullRequest
29 голосов
/ 03 июня 2009

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

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

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

Ответы [ 6 ]

29 голосов
/ 09 июня 2009

Спасибо за ваши ответы! Оказывается, я был совершенно неправ по поводу того, что это проблема браузера - проблема была на сервере. ASP.NET сериализует запросы того же сеанса, которые требуют состояния сеанса, поэтому в этом случае следующая страница не начала обработку на сервере до тех пор, пока эти запросы, инициированные ajax, не будут завершены.

К сожалению, в этом случае состояние сеанса требуется в обработчике http, который ответил на вызовы ajax. Но доступ только для чтения достаточно хорош, поэтому, пометив обработчик IReadOnlySessionState вместо IRequiresSessionState, блокировки сеанса не удерживаются и проблема устранена.

Надеюсь, эта информация окажется полезной для других.

12 голосов
/ 19 июля 2010

Относительно собственного ответа Тодда на этот вопрос ...

У меня только что была эта проблема с PHP, и то же самое решение сработало бы. Однако мне нужна была информация на сессии. Для разработчиков PHP вы можете позвонить session_write_close(), чтобы закрыть и записать сеанс в середине запроса Это освободит сеанс для других запросов.

3 голосов
/ 04 июня 2009

Возможно, вы захотите проверить странный побочный эффект abort ()

Когда используется метод abort (), событие readystatechange запускается в Explorer и Mozilla. Хуже того, readyState = 4, что означает, что средний скрипт xmlhttp предполагает, что данные были загружены правильно. Это может дать очень странные эффекты.

задокументировано здесь:

http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html

2 голосов
/ 03 июня 2009

Вы уверены, что используете асинхронный запрос? Если браузер блокирует весь запрос, вы используете синхронный запрос (параметр async равен false)

1 голос
/ 22 июня 2010

Проблема с сервером также имеет место с сервером Apache / Php, с которым я работаю. Удалил session_start для сценария, который ему не нужен (AJAX), и все работает как положено. Спасибо Тодду, который указал на подобную проблему!

0 голосов
/ 24 марта 2015

Ссылка на принятый ответ:

http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate/

О IRequiresSessionState

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

...