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();