在Node中异步地走树

时间:2013-11-14 22:50:56

标签: node.js asynchronous recursion tree

我正在尝试在Node中编写一个函数来递归检索Wikipedia类别树。给定父树,它应该调用API,获取类别,然后获取类别的子类别等,直到分支的末尾。

在同步语言中这是相对简单的,但是递归+异步会让我感到沮丧。

我有一个简单的函数call来打电话给MediaWiki API并获取任何对象的类别成员响应,该对象返回该类别中的两个页面和该类别中的子类别。 (Here's an example response。)

如果call是同步的,我会做这样的事情:

var categoryTree = function(category, tree) {
    if (!tree) {
        tree = {
            name: category,
            pages: [],
            subcategories: []
        };
    }

    var children = call(category);
    category.query.categorymembers.forEach(function(child) {
        // if it's a page
        var node = { name: child.title };
        if (child.ns == 0) {
            tree.pages.push(node);
        } else {
                    // if it's a subcat
            tree.subcategories.push(call(categoryTree(node.name, node)));               
        }
    });
    return tree;
}

但当然不是。 call函数使用request,因此它使用参数(category, callback)。到目前为止,我有这样的事情:

var categoryTree = function(category, callback, data, node) {
    call(category, cb);

    if (!data) {
        data = {};
        node = data;
    }

    function cb(members) {
        node.pages = [];
        node.subcategories = [];

        members.query.categorymembers.forEach(function(member) {
            var new_node = {
                name: member.title                   
            }
            if (member.ns == 14) {
                node.subcategories.push(new_node);
                categoryTree(member.title, callback, data, new_node);
            } else if (member.ns == 0) {
                node.pages.push(new_node);
            }
        });

        callback(data);
    }
}

这显然是不对的。是否可以进行异步递归树步行?

0 个答案:

没有答案