Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.03.2013, 11:29
Интересующийся
Отправить личное сообщение для Vincent Посмотреть профиль Найти все сообщения от Vincent
 
Регистрация: 22.08.2012
Сообщений: 11

Стек ajax запросов
Здравствуйте. Проблема в следующем:
Со страницы должно быть отправлено много ajax запросов (больше 30 точно), все к одному скрипту.
Что бы не нагружать браузер, хочу сделать стек запрсов, т.е. из стека (в роли которого будет массив) будут браться по 5 первых параметров, и на основе этих параметров создаваться пять ajax запросов. По мере того как запросы отработали, будут обновлены соответствующие элементы на странице и обновлен стек.

Пока реализация такая:
вначале создаем переменные:
var allArray = new Array(); // массив со всеми элементами (параметрами), на основе которых должны быть созданы ajax запросы
var allArrayStack = new Array(); // стек по 5 элементов (запрсов)
const STACK_LENGTH = 5; // длина стека
var intervalId = null; // intervalID, возвращаемый методом setInterval()


как только allArray заполнен, вызывается функция gettingResults:

function gettingResults() {
    intervalId = setInterval(appendStack, 1000);
}

function appendStack() {
    if( (allArrayStack.length < STACK_LENGTH) && (allArray.length > 0) ) {
        var counterHight = STACK_LENGTH - allArrayStack.length;
        for (var i = 0; i < counterHight ; i++) {
            if(allArray.length == 0) {
                clearInterval(intervalId);
                break;
            }

            allArrayStack[allArrayStack.length] = allArray[0];
            allArray.splice(0,1)
        }
    } else if(allArray.length == 0) {
        clearInterval(intervalId);
    }

// здесь получаем заполненный allArrayStack , на основе которого можем создавать ajax запросы.
}


Вопрос в том, какая должны быть логика далее? Т.е. передать allArrayStack в новый поток нельзя, так как весь js выполняется в одном потоке. Если передать allArrayStack в другую функцию, то по идее она не начнет выполнение пока не будет выполнен clearInterval(intervalId); (тут я сомневаюсь, я прав?)
Ответить с цитированием
  #2 (permalink)  
Старый 02.03.2013, 12:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Vincent
const STACK_LENGTH = 5; // длина стека
Не рановато ли conts начали использовать?

Сообщение от Vincent
все к одному скрипту.
В чем смысл? Почему не одним запросом?
Ответить с цитированием
  #3 (permalink)  
Старый 02.03.2013, 13:30
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

переделывайте логику, зачем вам 30 запросов к одному скрипту, еще и последовательных. Вам надо либо одним ограничиться, либо лонг поллинг организовать (если речь о статистике какой-то) или уже вебсокеты.
Ответить с цитированием
  #4 (permalink)  
Старый 02.03.2013, 15:20
Интересующийся
Отправить личное сообщение для Vincent Посмотреть профиль Найти все сообщения от Vincent
 
Регистрация: 22.08.2012
Сообщений: 11

danik.js,
Цитата:
Не рановато ли conts начали использовать?
на счет const, да, заменю на var, спасибо.

Цитата:
В чем смысл? Почему не одним запросом?
Это необходимо вот для чего.
Каждый элемент в массиве представляет различные параметры запроса.
Скрипт на той стороне обрабатывает эти параметры по разному, т.е. что то раньше, что то позже. Если посылать все одним запросом, то ответ смогу получить только после того, как все параметры будут обработаны. А это займет гораздо больше времени, чем обработка одного запроса.

Вторая причина следующая. Скорее всего есть элегантное решение, если это так, буду рад узнать о нем.
Тот скрипт, на который шлет запросы ajax, обращается к другому сервису, находящемуся на том же ip но доступному по другому порту. Это не проблема архитектуры, так надо. Я не нашел информации, как можно ajax ом напрямую обратиться к другом порту на том же сервере. А обращение к другому домену запрещено политикой безопасности.


nasqad,
спасибо за пример. Вы меня натолкнули на мысль, что рекурсией было бы удобнее воспользоваться.
Я так понимаю, отправка данных ajax ом происходит вызовом var xhrObject = new activeXblabla(opts, callback);


tadjik1,
Про 30 запросов я описал выше. В качестве альтернативы, как я опнял, вы предлагаете лонг поллинг. Сейчас буду читать что это такое.

Дело в том, что ранее я c js не работал, сейчас вот понадобилось. Вникаю в процессе, по этому если в чем то изобретаю велосипед - буду раз комментариям
Ответить с цитированием
  #5 (permalink)  
Старый 02.03.2013, 17:42
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Vincent
Со страницы должно быть отправлено много ajax запросов (больше 30 точно), все к одному скрипту.
автокомплит или что-то подобное? Используете шаблон прокси-объект. Собираете запросы в кучу и отправляете разом.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 02.03.2013, 22:26
Интересующийся
Отправить личное сообщение для Vincent Посмотреть профиль Найти все сообщения от Vincent
 
Регистрация: 22.08.2012
Сообщений: 11

nasqad, спасибо еще раз, сделал по Вашему варианту, изменив логику под свою.

Спасибо всем за комментарии, получил много полезной информации
Ответить с цитированием
  #7 (permalink)  
Старый 04.03.2013, 15:08
Аватар для keen
Профессор
Отправить личное сообщение для keen Посмотреть профиль Найти все сообщения от keen
 
Регистрация: 28.03.2012
Сообщений: 376

какая-то страшненькая реализация стека у вас вышла.
да и зачем изобретать велосипед - у библиотеки async есть замечательная фунция queue.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько ajax запросов одновременно pitbull0007 AJAX и COMET 3 16.10.2012 19:08
PHP: несколько AJAX запросов с долговременной обработкой на сервере FINoM Серверные языки и технологии 9 20.03.2012 19:50
Одновременное количество AJAX запросов decadent AJAX и COMET 18 03.06.2011 18:16
Отследить окончание нескольких ajax запросов mikel AJAX и COMET 2 11.03.2011 17:14
Не приходят калбэки от Ajax запросов sundevil AJAX и COMET 22 04.10.2010 13:27