Javascript 递归回调

Javascript 递归回调,javascript,node.js,Javascript,Node.js,需要一些帮助才能让这个面包屑构建器工作-它是父类别的递归获取,应该返回一个条目数组。不太好用,我的脑子都快炸了。。。。当前仅返回最后一个条目 var walk = function(c, done) { var results = []; Category.findById(c).exec(function(err, cat) { if(cat) { results.push({ title: cat.title, id: cat.id}); if(cat

需要一些帮助才能让这个面包屑构建器工作-它是父类别的递归获取,应该返回一个条目数组。不太好用,我的脑子都快炸了。。。。当前仅返回最后一个条目

var walk = function(c, done) {
  var results = [];
  Category.findById(c).exec(function(err, cat) {
    if(cat) {
      results.push({ title: cat.title, id: cat.id});
      if(cat.parent) {
        walk(cat.parent, function(err, res) {
          results = results.concat(res);
        });
      }
      return done(null, results);
    }
    done(results);
  });
};

walk(product.categories[0].id, function(err, results) {
//  if (err) console.log (err);
  console.log(results);
});

不幸的是,递归和回调并没有很好地结合在一起。在检索第一个类别后,您正在调用
done
,但在调用
done
之前,您不会等待对
walk
的其他调用完成。你需要等他们。我会这样做(伪代码):

获取此类别
如果没有子类别
使用[{title:…}]调用callback并返回
待定=子类别数
结果=[{title:…}]]
对于每个子类别
递归
未决--
结果[索引+1]=子类别\u结果
如果没有挂起
使用结果子数组的串联调用回调
怎么样?试试这个

好例子如下:


还有写咖啡脚本的方法

好的,明白了。。。。需要从内部漫游调用完成调用

var walk = function(c, done) {
  var results = [];
  Category.findById(c).exec(function(err, cat) {
    if(cat) {
      results.push({ title: cat.title, id: cat.id});
      if(cat.parent) {
        walk(cat.parent, function(err, res) {
          results = results.concat(res);
          done(null, results);
        });
      } else {
         done(null, results);
      }
    } else {
      done('No cat found'); // Error
    }
  });
};

他可以添加一个堆栈计数器,这样他就可以在最底层调用它一次。@scones:恐怕我不太明白你在说什么。也许你想添加你自己的答案?请注意,每只猫只有一个父猫,如果猫没有父猫,那么它应该结束。我在做(结果)之前做了一个else,但那也不正确