Несколько вызовов Ajax jQuery одновременно - долгое ожидание ответа и невозможность отменить

Моя проблема в следующем:

  • На странице я выполняю несколько (6) вызовов ajax (через jQuery) для одновременного получения некоторых данных (используя оболочку php для получения данных через вызовы)
  • Запросы выполняются одновременно и их выполнение занимает 10-20 секунд.
  • Если пользователь нажимает на любую из ссылок, чтобы перейти в другое место (на другую страницу), я вижу, что все невыполненные вызовы отменяются.
  • Однако браузер все еще ждет 20 секунд, чтобы перейти на другую страницу - это похоже на то, что он все еще ждет завершения самого длинного вызова, даже если он отменен.

(Такая же проблема возникает в Chrome и Firefox, вызовы ajax являются асинхронными ... Я попытался установить тайм-аут ajax, чтобы зафиксировать readystate = o в ответе на ошибку ajax, даже пытался что-то сделать с веб-рабочими, но безрезультатно)

Любая информация будет полезна

Спасибо!


person IvanS    schedule 04.12.2013    source источник
comment
Вам больше повезет с получением хорошего ответа, если вы опубликуете код.   -  person Kehlan Krumme    schedule 04.12.2013
comment
и вам лучше отправить только один запрос ajax для получения всех данных   -  person A. Wolff    schedule 04.12.2013
comment
Есть ли способ объединить звонки в один?   -  person scrowler    schedule 04.12.2013
comment
Попробовали явно использовать метод ajax abort ()?   -  person A. Wolff    schedule 04.12.2013
comment
Да, я тоже пробовал метод abort () ... На самом деле, даже если я нажму кнопку Stop в браузере и нажму на любую другую ссылку, он все равно будет ждать завершения отмененных вызовов (например, не будет переходить в течение 20 секунд) ... Я попробую объединить звонки в один звонок (хотя сомневаюсь, что это поможет)   -  person IvanS    schedule 04.12.2013
comment
Как объясняется ниже, на самом деле это оказалось проблемой на стороне сервера - неправильное управление сеансом, приводящее к блокировке браузера). Спасибо всем за ваши комментарии.   -  person IvanS    schedule 05.12.2013


Ответы (1)


Это связано с maximum number of connections привязкой браузера к одному домену.

См. Browserscope для получения информации о максимальном количестве для каждого браузера.

  • IE 8 + 9: 6 подключений
  • IE 10: 8 соединений
  • Chrome 26: 6 подключений
  • Firefox 21: 6 подключений

Что вы можете сделать, так это собрать все отложенные объекты и отменить их, когда пользователь щелкает ссылку.

пример:

// some ajax calls
doAjax({});
doAjax({});

var requests = [];

// helper function to perform and register calls
function doAjax(options) {
    var jqXHR= $.ajax(options);
    requests.push(jqXHR);
    jqXHR.always(function(jqXHR) {
         var index = requests.indexOf(jqXHR);
         if (index!=-1) {
             requests.splice(index, 1);
         }
    });
}

// function to abort all calls
// when your application has a router to provide navigation, this function
// is typically called when you navigate to another page
function abortAllPendingRequests() {
    var i;
    for (i=0; i<requests.length; i++) {
        var xhr = requests[i];
        // already finished calls (readyState 4) should not be aborted
        if (xhr.readyState != 4) {
            xhr.abort();
        }
    }
};

Осталось только вызвать функцию abortAllPendingRequests, когда пользователь пытается перейти на другую страницу.

Если у вас есть какой-то router (например, Backbone.Router), вы можете вызвать его там.

Если в вашем приложении нет router для навигации, но вы используете простые якорные ссылки, вы можете добавить к ссылкам onClick, который вызывает функцию abortAllPendingRequests.

person R. Oosterholt    schedule 04.12.2013
comment
Спасибо за очень подробное объяснение и помощь ... Моя проблема на самом деле оказалась проблемой на стороне сервера (неправильное управление сеансом, приводящее к блокировке вызовов). - person IvanS; 05.12.2013