我需要一個遞歸函數異步發生,回調完成後會發生回調。我簡化它擺脫了不相關部分(這裏是一個的jsfiddle代碼:http://jsfiddle.net/DgaBg/8/)如何在異步recusive方法完全準備好時創建回調?
tree = {
"a": {
"b": 1,
"c": 2
},
"d": {
"e": {
"f": {
"g": 3
},
"h": 4,
"i": 5
},
"j": {
"k": 6,
"l": 7
},
"m": 8,
"n": 9
},
"o": {
"p": 10
},
"q": 11
};
Watcher = function() { };
Watcher.prototype.startDoingAsyncStuff = function(node, callback) {
var me = this,
key;
if(typeof node === "number") {
console.log(node);
} else {
for(key in node) {
if(node.hasOwnProperty(key)) {
(function(node) {
setTimeout(function() {
me.startDoingAsyncStuff(node, callback);
}, 500);
}(node[key]));
}
}
}
};
w = new Watcher();
w.startDoingAsyncStuff(tree, function() {
console.log("callback 1");
});
w.startDoingAsyncStuff(tree["d"], function() {
console.log("callback 2");
});
我需要提供給Watcher.startDoingAsyncStuff
回調執行recusion完成後,但我不知道如何做到這一點。
這裏的複雜因素是,使用一個簡單的計數器是不可能的,因爲Watcher.startDoingAsyncStuff
應該能夠多次執行,而無需等待以前的調用來完成。
任何幫助,將不勝感激。
你願意使用jQuery或類似的圖書館嗎? – glortho 2011-12-19 15:56:24
我是,但我認爲添加jquery有點矯枉過正,只是爲了實現這一點。你會怎麼說我會用jQuery來做這件事? – standardModel 2011-12-19 15:58:11
'$ .Deferred'在這裏會有所幫助(儘管你可以通過創造性的超時來實現)。就像在開始之前創建一個新的$ .Deferred,並在給定時間內沒有設置標誌500毫秒或其他值(儘管可能比您需要的時間更長)中給它一個超時值。每次運行'startDoingAsyncStuff'都會重置該標誌,所以$ .Deferred保持未解析狀態。用$ .Deferreds肯定會有更好的方式,但是,在開始之前計算所有遞歸級別並從計數中減去,將延遲解決爲0或其他值。 – glortho 2011-12-19 16:05:11