Я не могу понять это самостоятельно и вам нужна ваша помощь. Я работаю с вложенными базовыми объектами в приложении phonegap и хочу сохранить их все. Во время сохранения я хочу показать анимацию загрузки. Когда все будет сохранено, я хочу продолжить следующую страницу/шаг. Я уже достиг этого, но анимация не работает, потому что мои циклы сохранения блокируют все обновления пользовательского интерфейса. (Я сохраняю в localStorage, а не через ajax.) Поэтому я попытался замедлить сохранение, вставив таймауты между сохранением каждого элемента. Теперь сохранение задерживается, но inteface продолжает следующую страницу, прежде чем все будет сохранено. Мои обратные вызовы, похоже, настроены неправильно.Как проходить через вложенные объекты с задержкой
Знаете ли вы образец для чистых вложенных обратных вызовов?
Я собрал a fiddle that illustrates my problem.
Можете ли вы помочь мне исправить это, так, что он создает оповещения в правильном порядке: A1, A2, A3, A4, A5, A6, A7, B1, B2, B3, Everything is finished
Спасибо большое заранее.
Вот код, если вы не хотите, чтобы проверить скрипку:
var forest = {
"trees": [{
"id": "tree A",
"leaves": [{
"name": "A1"
}, {
"name": "A2"
}, {
"name": "A3"
}, {
"name": "A4"
}, {
"name": "A5"
}, {
"name": "A6"
}, {
"name": "A7"
}]
}, {
"id": "tree B",
"leaves": [{
"name": "B1"
}, {
"name": "B2"
}, {
"name": "B3"
}]
}]
};
var callback = function() {
alert("Everything is finished");
};
var workOnTree = function (tree, callback) {
var leaves = tree.leaves;
var leafCount = 0;
var delayedAlert = function() {
alert(leaves[leafCount].name);
leafCount += 1;
if (leafCount < leaves.length) {
setTimeout(delayedAlert, 1000);
} else {
if (callback !== undefined && typeof callback == 'function') {
callback();
}
}
};
setTimeout(delayedAlert, 1000);
};
var workOnForest = function (forest, callback) {
var trees = forest.trees;
var treeCount = 0;
var delayedExecution = function() {
if (treeCount == (trees.length - 1)) {
// for last tree pass callback
workOnTree(trees[treeCount], callback);
} else {
workOnTree(trees[treeCount]);
}
treeCount += 1;
if (treeCount < trees.length) {
// this gives a delay between the trees
setTimeout(delayedExecution, 1000);
}
};
setTimeout(delayedExecution, 1000);
};
workOnForest(forest, callback);
Не работает ли это лучше, если вы только вызвали setTimeout для следующего обратного вызова во время обработки текущего? Таким образом, они правильно сериализованы. – cirrus
все еще пытается понять, что вы имеете в виду. :-) У меня есть два вложенных цикла, если вы внимательно посмотрите на них. для каждого дерева, для каждого листа. как бы вы к трюку? –
Если бы у меня был только один цикл, вы были правы (если бы я правильно вас понял ...). Для одного цикла setTimeout не изменяет последовательность (если это слово :-)) –