Показать сообщение отдельно
  #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); (тут я сомневаюсь, я прав?)
Ответить с цитированием