【发布时间】:2015-06-19 20:33:48
【问题描述】:
我需要递归地下降一个链表数据库树
item 1-> item 2
-> item 3 -> item 4
-> item 5 -> item 6 -> item 7
-> item 8
我的伪代码是
var getItems = function(itemid) {
db.getitem(itemid, function(item) {
item.items.forEach(function(subitem) {
getItems(subitem.id)
})
})
getItems(1)
但是,db.getItem 是一个异步函数
我想返回一个与图相同结构的JS对象给顶层调用者
实现这一目标的最佳方法是什么?我不知道前面的结构(即不知道每个项目的项目数,或树中任何分支的深度),所以我不知道需要处理的项目数
我尝试了异步库的各种方法,但似乎都没有处理递归
【问题讨论】:
-
递归取决于父值,即调用者将传递值,正如您所说的那样,您的方法是异步的,这不是建议的方法。您需要保持操作同步。
-
我假设你只需要某个节点的子节点,而不是所有的树,而且树很大。因为如果我们谈论的是 10-100 个节点,那么将它们全部拉出并用 JS 构建树“客户端”会更快/更容易。也许还缓存生成的树? 另外,除了github.com/luciotato/waitfor 之外,真的没有办法进行真正的“同步”数据库调用AFAIK(stackoverflow.com/questions/26839320/…),但这确实违背了JS 和NodeJS 的全部意义。
-
如果必须,请使用事件 (nodejs.org/api/events.html) 而不是异步包。
标签: javascript node.js asynchronous recursion