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);
|
Цитата:
|
tsigel почти сделал по вашему примеру, но как в data запихнуть в Item2.1 еще и Item3.3 зная только родителя Item2.1
и как удалить Item3.1 например, есть простой способ? или нужно перебирать весь массив каждый раз |
Цитата:
|
icom,
Синхронные запросы использовать не стоит, они вешают браузер пока не придет ответ. Цитата:
|
icom,
Ну я не знаю как ещё помочь, выложите пример тех объектов по которым надо отправить запрос |
Цитата:
|
прошло 4 месяца и я решил опять вернутся к задачи)
window.addEvent('domready', function(evt) {
if (typeof(getCookie) == 'function') {
var ids_array = getCookie('ids_array');
if (ids_array) {
var ids_obj = JSON.parse(ids_array);
var toRequest = [];
var getDataToRequest = function(data) {
toRequest.push(data.name);
if (data.content) {
data.content.forEach(getDataToRequest);
}
};
getDataToRequest(ids_obj);
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));
if (typeof $(data) !== 'undefined') {
if ($(data).hasClass('namesc_sub')) {
SDD.checkSubs(parseInt(data.substr(11)));
} else if ($(data).hasClass('namesc')) {
SDD.checkSub(data);
}
}
}
};
var request = function(arr) {
$.get(arr.shift(), function(data) {
console.log(data + " loaded!");
if (arr.length) {
request(arr);
} else {
alert("Все загружено!");
}
});
};
request(toRequest);
}
}
});
вопрос, куда впихнуть код, который находится в 26 строке, он и вызывает аякс запросы
if (typeof $(data) !== 'undefined') {
if ($(data).hasClass('namesc_sub')) {
SDD.checkSubs(parseInt(data.substr(11)));
} else if ($(data).hasClass('namesc')) {
SDD.checkSub(data);
}
}
и как $.get переделать под mootools, я так понимаю что var $ = { переопределяет переменную (функцию, хз как точно сказать) mootools |
icom,
код который написан с 18 по 34 строку я писал просто чтобы показать видимость аякс запроса. Это эмуляция. уберите его и подлключите jQuery или библиотеку со схожим аякс интерфейсом. Сам запрос стартует в 37 строке. То что у вас на 26 вообще уберите и скажите что хотели этим кодом. На строке 39 я оставил место для вашего кода. Этот код вызывается при при получении каждого ответа. |
про видимость аякса я понял, мой код
if (typeof $(data) !== 'undefined') {
if ($(data).hasClass('namesc_sub')) {
SDD.checkSubs(parseInt(data.substr(11)));
} else if ($(data).hasClass('namesc')) {
SDD.checkSub(data);
}
}
как раз и вызывает функции с аяксом, функции рабочие там ничего нет такого, мне их и надо впихнуть в ваш пример, но не знаю как пробую так
window.addEvent('domready', function(evt) {
if (typeof(getCookie) == 'function') {
var ids_array = getCookie('ids_array');
if (ids_array) {
var ids_obj = JSON.parse(ids_array);
var toRequest = [];
var getDataToRequest = function(data) {
toRequest.push(data.name);
if (data.content) {
data.content.forEach(getDataToRequest);
}
};
getDataToRequest(ids_obj);
var request = function(arr) {
var data = arr.shift();
if (typeof $(data) !== 'undefined') {
if ($(data).hasClass('namesc_sub')) {
SDD.checkSubs(parseInt(data.substr(11)));
} else if ($(data).hasClass('namesc')) {
SDD.checkSub(data);
}
}
};
request(toRequest);
}
}
});
но пишет TypeError: $(...) is null jQuery не подойдет, так как до меня уже все написали на mootools |
| Часовой пояс GMT +3, время: 01:37. |