NodeJS:递归树浏览

时间:2017-01-13 14:01:24

标签: javascript node.js recursion tree

我试图从他们的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()调用尾巴,但同样的问题仍然存在。

2 个答案:

答案 0 :(得分:0)

使用appendFileSync代替appendFile,以确保它们全部按顺序编写。

fs.appendFileSync(file, data);
tail(file, rowid, entryCount);

您的代码将在新行上显示每个节点,这将令人困惑(您不会知道分支的开始和结束位置)。如果你想显示从根开始并在一行的叶子上结束的分支,你将不得不更改代码(你必须在字符串中累积结果并将其传递给tail调用,只有当您遇到没有孩子的节点时才打印它,然后您将打印换行符'\n')。

答案 1 :(得分:0)

有两种解决方案可以在NodeJS中进行深度浏览:一种是使用串行回调的纯功能,另一种是使用async.series为每个分支强制串行。