Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.03.2015, 15:56
Интересующийся
Отправить личное сообщение для icom Посмотреть профиль Найти все сообщения от icom
 
Регистрация: 15.11.2014
Сообщений: 10

ajax в цикле
не могу никак сделать чтоб в цикле
for (var key in obj) {
аякс запрос;
}

переходило на следующую итерацию только тогда, когда завершится аякс запрос, как сделать задержку или что-то подобного рода? использую mootools
Ответить с цитированием
  #2 (permalink)  
Старый 25.03.2015, 16:04
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

icom,
var arr = [...] //Массив данных для запроса

var request = function (arr) {//Функция которая делает запрос принимает массив даннх для запроса
  $.get(arr.pop, function (data) {//Делаем запрос отрезая от массива последние данные (запрос с последним элементом массива)
     ...// обрабатываем ответ
     if (arr.length)  request(arr); //Если в массиве ещё есть данные вызываем снова функциб запроса передавая туда остатки массива пока он не кончится
  });
}
request(arr);

Последний раз редактировалось tsigel, 25.03.2015 в 16:07.
Ответить с цитированием
  #3 (permalink)  
Старый 25.03.2015, 16:17
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

icom, цикл тут тебе не помощник...

Как вариант, шли следующий запрос в ответе на предыдущий...
Ответить с цитированием
  #4 (permalink)  
Старый 25.03.2015, 16:26
Интересующийся
Отправить личное сообщение для icom Посмотреть профиль Найти все сообщения от icom
 
Регистрация: 15.11.2014
Сообщений: 10

tsigel логику понял, спасибо, но как это применить к такому коду?
var ids_array = getCookie('ids_array');
			
			function openIds(obj) {
				for (var key in obj) {
				
					if (typeof $(key) !== 'undefined') {
						if ($(key).hasClass('namesc_sub')) {
							SDD.checkSubs(parseInt(key.substr(11)));
						} else if ($(key).hasClass('namesc')) {
							SDD.checkSub(key);
						}
					}
					
					var next_obj = eval('obj.' + key);
						
					if (next_obj !== undefined) {
						openIds(next_obj);
					}
				}
			}
			
			if (ids_array) {
				var ids_obj = JSON.parse(ids_array);
				openIds(ids_obj);
			}


ids_obj многоуровневый\многомерны объект, и нужно пройтись по каждому элементу, каждый элемент участвует в аякс запросе
SDD.checkSubs и SDD.checkSub функции с аяксом

Последний раз редактировалось icom, 25.03.2015 в 16:29.
Ответить с цитированием
  #5 (permalink)  
Старый 25.03.2015, 16:30
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

icom,
ой, я дочитал до строчки с eval и понял что там что-то сооовсем не так

Попробуйте целиком описать задачу словами, возможно Вам предложат другое архитектурное решение чтобы не было таких страшных функций.
Ответить с цитированием
  #6 (permalink)  
Старый 25.03.2015, 16:31
Интересующийся
Отправить личное сообщение для icom Посмотреть профиль Найти все сообщения от icom
 
Регистрация: 15.11.2014
Сообщений: 10

нужно чтоб цикл "остановился" пока не отработает SDD.checkSubs
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2015, 16:33
Интересующийся
Отправить личное сообщение для icom Посмотреть профиль Найти все сообщения от icom
 
Регистрация: 15.11.2014
Сообщений: 10

tsigel сейчас сформулирую
ksa возможно, но больше ничего не придумал, сейчас попробую объяснить что мне нужно
Ответить с цитированием
  #8 (permalink)  
Старый 25.03.2015, 17:31
Интересующийся
Отправить личное сообщение для icom Посмотреть профиль Найти все сообщения от icom
 
Регистрация: 15.11.2014
Сообщений: 10

есть такая гармошка) http://hotel.biz.ua/truby-i-fitingi.html
при нажатии аяксом подгружается контент с такими же гармошками, вложенность безграничная, моя задача чтоб при перезагрузке страницы, автоматом открывались вкладки, которые были открыты до этого
я при нажатии на вкладку, сохраняю ее id в строку json в куках, в виде многомерного объекта, иначе никак не придумал, потом в цикле перебираю этот объект, и открываю по очереди
Ответить с цитированием
  #9 (permalink)  
Старый 25.03.2015, 17:32
Интересующийся
Отправить личное сообщение для icom Посмотреть профиль Найти все сообщения от icom
 
Регистрация: 15.11.2014
Сообщений: 10

все бы работало, если бы в цикли успевали обрабатываться аякс запросы
Ответить с цитированием
  #10 (permalink)  
Старый 25.03.2015, 18:01
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

/**
 * Структурируйте ваши данные чтобы вам проще было с ними работать
 */
var data = {
    name: "Item1",
    content: [
        {
            name: "Item2.1",
            content: [
                {
                    name: "Item3.1",
                    content: []
                },
                {
                    name: "Item3.2",
                    content: []
                }
            ]
        },
        {
            name: "Item2.2",
            content: []
        },
        {
            name: "Item2.3",
            content: []
        }
    ]
};

/**
 * Превращаем наш структурированный объект любой глубины в массив данных для запроса
 * @type {Array}
 */
var toRequest = [];
var getDataToRequest = function (data) {
    toRequest.push(data.name);
    if (data.content) {
        data.content.forEach(getDataToRequest);
    }
};
getDataToRequest(data);

/**
 * Это эмуляция аякса (Время запроса от 1 до 2 секунд)
 * @type {{get: Function}}
 */
var $ = {
    get: function (data, success) {
        function getRandomInt(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }
        setTimeout(function () {success(data)}, getRandomInt(1000, 2000));
    }
};

/**
 * Запрашиваем данные из массива по очереди начиная с 1 элемента массива
 * @param arr
 */
var request = function (arr) {
    $.get(arr.shift(), function (data) {
        console.log(data + " loaded!");
        if (arr.length) {
            request(arr);
        } else {
            alert("Все загружено!");
        }
    });
};
request(toRequest);
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу выпрыгнуть из ajax Rommik jQuery 10 14.08.2014 12:44
Ajax в цикле imediasun1 Элементы интерфейса 7 02.09.2013 19:25
как запустить в цикле последовательно две функции вызова ajax Bakhit jQuery 4 24.08.2013 12:13
Ajax таблица gofkane Работа 1 26.09.2011 18:26
Ajax таблица gofkane Работа 0 25.09.2011 11:53