我正在尝试在 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);
}
}
这显然是不对的。是否可以进行异步递归树遍历?