ajax в цикле
не могу никак сделать чтоб в цикле
for (var key in obj) { аякс запрос; } переходило на следующую итерацию только тогда, когда завершится аякс запрос, как сделать задержку или что-то подобного рода? использую mootools |
icom,
var arr = [...] //Массив данных для запроса var request = function (arr) {//Функция которая делает запрос принимает массив даннх для запроса $.get(arr.pop, function (data) {//Делаем запрос отрезая от массива последние данные (запрос с последним элементом массива) ...// обрабатываем ответ if (arr.length) request(arr); //Если в массиве ещё есть данные вызываем снова функциб запроса передавая туда остатки массива пока он не кончится }); } request(arr); |
icom, цикл тут тебе не помощник...
Как вариант, шли следующий запрос в ответе на предыдущий... |
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,
ой, я дочитал до строчки с eval и понял что там что-то сооовсем не так Попробуйте целиком описать задачу словами, возможно Вам предложат другое архитектурное решение чтобы не было таких страшных функций. |
нужно чтоб цикл "остановился" пока не отработает SDD.checkSubs
|
tsigel сейчас сформулирую
ksa возможно, но больше ничего не придумал, сейчас попробую объяснить что мне нужно |
есть такая гармошка) http://hotel.biz.ua/truby-i-fitingi.html
при нажатии аяксом подгружается контент с такими же гармошками, вложенность безграничная, моя задача чтоб при перезагрузке страницы, автоматом открывались вкладки, которые были открыты до этого я при нажатии на вкладку, сохраняю ее id в строку json в куках, в виде многомерного объекта, иначе никак не придумал, потом в цикле перебираю этот объект, и открываю по очереди |
все бы работало, если бы в цикли успевали обрабатываться аякс запросы
|
/** * Структурируйте ваши данные чтобы вам проще было с ними работать */ 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); |
Часовой пояс GMT +3, время: 13:05. |