我不能單獨弄清楚這一點,需要你的幫助。 我正在使用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不會改變順序性(如果這是一個詞:-)) –