1

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

这在同步语言中相对直截了当,但递归 + 异步让我绊倒了。

我有一个简单的函数call调用 MediaWiki API并获取任何对象的 categorymembers 响应,它返回该类别中的页面和该类别中的子类别。(这是一个示例响应。)

如果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);
    }
}

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

4

0 回答 0