【发布时间】:2017-10-05 04:01:35
【问题描述】:
我有一个简单的树,其 id 是 Mongo 集合的键。我正在使用一个名为treewalker 的节点库。当我遍历树的每个节点时,我正在尝试查找名称(使用猫鼬)并将其简单地附加到当前节点。如果我不执行回调来查找节点名称,而只使用一些固定值,我会得到我期望的值。让我用代码来说明:
这是我的树:
{
"categoryTree": [
{
"categoryId": "1",
"children": [
{
"categoryId": "2",
"children": [
{
"categoryId": "3",
"children": []
},
{
"categoryId": "4",
"children": []
}
]
},
{
"categoryId": "5",
"children": []
},
{
"categoryId": "6",
"children": []
}
]
},
{
"categoryId": "7",
"children": [
{
"categoryId": "8",
"children": []
}
]
}
]
}
这是我想要的代码:
catTree.categoryTree.forEach(function(node){
var counter = 0;
tree.walkTree(node, 'children', function(obj){
obj.name = counter++;
});
});
//This tree has the names (as the counter above) in it as I expect
console.log(JSON.stringify(catTree));
但是,只要我抛出一个 mongoose 回调来获取类别名称,打印的类别树就不再有名称。
catTree.categoryTree.forEach(function(node){
tree.walkTree(node, 'children', function(obj){
//Cat is a mongoose model defined elsewhere
Cat.findById(obj.categoryId, {_id:0,name:1}).exec(function(err, value){
obj.name = value.name;
});
});
});
//This tree has NO names :(
console.log(JSON.stringify(catTree));
我知道这是时间问题,但我不知道如何解决。我看过几篇 SO 文章 like this one 建议跟踪回调并仅在它们都被调用后继续。我不知道如何将该模式应用于我的案例,因为我正在走一棵树,而不仅仅是迭代一个平面列表。我开始认为我的问题可能是我正在使用 treewalker 库,而不是在访问每个节点后使用回调编写我自己的算法。
非常感谢您的帮助!
【问题讨论】:
-
看看 async.js
标签: javascript node.js mongoose callback tree