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