我不能单独弄清楚这一点,需要你的帮助。 我正在使用phonegap应用程序嵌套的主干对象,并且想要将它们全部保存。在保存时,我想显示一个加载动画。当一切都保存时,我想继续下一页/步骤。 我已经实现了这一点,但动画无效,因为我的保存循环阻止了所有UI更新。 (我保存到localStorage,而不是通过ajax。)所以我试图通过在保存每个项目之间插入超时来减慢储存。现在保存被延迟了,但是在一切都被保存之前,接口继续到下一页。我的回调似乎设置不正确。如何通过延迟迭代嵌套对象
你知道一个干净的嵌套回调模式吗?
我已经放在一起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
仍试图了解你的意思。 :-)如果仔细观察,我有两个嵌套for循环。为每棵树,为每片叶子。你会怎么做? –
如果我只有一个循环,你是对的(如果我正确理解你的话......)。对于一个循环setTimeout不会改变顺序性(如果这是一个词:-)) –