私はこれを一人で理解することはできず、あなたの助けが必要です. phonegap アプリでネストされたバックボーン オブジェクトを操作していて、それらをすべて保存したいと考えています。保存中に読み込みアニメーションを表示したい。すべてが保存されたら、次のページ/ステップに進みたいと思います。これは既に達成しましたが、保存ループがすべての UI 更新をブロックしているため、アニメーションが機能しません。(私はajax経由ではなく、localStorageに保存しています。)したがって、各アイテムの保存の間にタイムアウトを挿入して、保存を遅くしようとしました。現在、保存は遅れていますが、インターフェイスはすべてが実際に保存される前に次のページに進みます。コールバックが正しく設定されていないようです。
きれいにネストされたコールバックのパターンを知っていますか?
私の問題を説明するフィドルをまとめました。
アラートが正しい順序で作成されるように、修正を手伝ってもらえますか。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);