Asynchronous Recursion in JavaScript
HTML
<pre id="out"></pre>
JavaScript
function out(s) {
$("#out").append(s+'\n');
}
/* tree visualization
root
a
b
c
d
e
f
g
*/
// tree data
var c = { id:3, len:2, children: []};
var d = { id:4, len:4, children: []};
var g = { id:7, len:1, children: []};
var f = { id:6, len:3, children: []};
var e = { id:5, len:2, children: [f]};
var b = { id:2, len:3, children: [c,d]};
var a = { id:1, len:1, children: [b,e]};
var root = {id:0, len:0, children: [a,g]};
// keep track of recursion count
var count = 0;
// to be called when recursion is completed
function last() {
out('this should be last');
}
// call 'last' when count is 0
var done = function() {
if (count==0) last();
}
// the recursive function
function recurse(node) {
count++;
out(node.id);
var wait = node.len * 100;
var walk = function() {
for (var i=0; i<node.children.length; i++) {
recurse(node.children[i]);
}
count--;
done();
}
// simiulate an asyncrhonous call to get children
setTimeout(walk, wait);
}
// kick off the recursion
function run() {
out('entering run');
recurse(root);
out('leaving run');
}
// and begin
run();