我试图从他们的parentID浏览数据库结果,可以将这些结果与每个节点上具有多个分支的树进行比较,其中我想在每个分支中浏览它的分支(不是逐级)。这是我的递归函数:
(function tail(file, parentID, entryCount) {
console.log("TAIL CALLED: ", self);
var opts = new Map();
var data = "";
opts["parentID"] = parentID;
opts["Key"] = "";
opts["Value"] = "";
opts["RowID"] = "";
self.Read(opts, function (err, rslt ) {
for (var i = 0; i < rslt.length; ++i) {
(function () {
data = (rslt[i].Key + (rslt[i].Value != "-" ? rslt[i].Value : ""));
data += "\n";
var rowid = rslt[i].rowid;
fs.appendFile(file, data, function (err, rslt) {
(tail(file, rowid, entryCount));
});
})();
}
})
})(file, parentID, entryCount);
这个函数给出了逐级结果,我认为我可以理解为什么(尾部的递归调用被放在堆栈上而不是立即执行?),但是无法看到如何使它工作......
我尝试使用fs.appendFileSync()调用尾巴,但同样的问题仍然存在。
答案 0 :(得分:0)
使用appendFileSync
代替appendFile
,以确保它们全部按顺序编写。
fs.appendFileSync(file, data);
tail(file, rowid, entryCount);
您的代码将在新行上显示每个节点,这将令人困惑(您不会知道分支的开始和结束位置)。如果你想显示从根开始并在一行的叶子上结束的分支,你将不得不更改代码(你必须在字符串中累积结果并将其传递给tail
调用,只有当您遇到没有孩子的节点时才打印它,然后您将打印换行符'\n'
)。
答案 1 :(得分:0)
有两种解决方案可以在NodeJS中进行深度浏览:一种是使用串行回调的纯功能,另一种是使用async.series为每个分支强制串行。