Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS:递归树浏览_Javascript_Node.js_Recursion_Tree - Fatal编程技术网

Javascript NodeJS:递归树浏览

Javascript NodeJS:递归树浏览,javascript,node.js,recursion,tree,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;

我试图从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);
(函数尾部(文件、父ID、入口计数){
log(“尾部调用:”,self);
var opts=newmap();
var数据=”;
opts[“parentID”]=parentID;
选择[“键”]=“”;
选项[“值”]=“”;
选项[“RowID”]=“”;
self.Read(选项、函数(err、rslt){
对于(变量i=0;i
这个函数给了我逐级的结果,我想我可以理解为什么(tail的递归调用被放在堆栈上,并且没有立即执行?),但看不到如何使它工作


我也尝试过使用fs.appendFileSync()在下面调用tail,但同样的问题仍然存在。

使用
appendFileSync
而不是
appendFile
,以确保它们都按顺序编写

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

您的代码将在新行上显示每个节点,这会让人感到困惑(您不知道分支的起点和终点)。如果要在一行上显示从根开始到叶结束的分支,则必须更改代码(必须将结果累积为字符串,并将其传递给
尾部
调用,仅当遇到没有子节点的节点时才打印它,然后打印新行字符
'\n'
).

在NodeJS中实现深度浏览有两种解决方案:一种是使用串行回调的纯函数,第二种是使用async.series为每个分支强制串行。

for循环仍然在递归调用tail之前进行,因此我仍然有width结果,而不是deph结果:s