0

需要一些帮助来尝试让这个面包屑生成器工作 - 它是对应该返回条目数组的父类别的递归获取。不太工作,我的大脑被炸了....目前只返回最后一个条目。

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);
});
4

3 回答 3

0

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

fetch this category
    if no subcategories
        call callback with [{ title: ... }] and return
    pending = number of subcategories
    results = [[{ title: ... }]]
    for each subcategory
        recurse
            pending--
            results[index + 1] = subcategory_results
            if none pending
                call callback with the concatenation of the subarrays of results
于 2013-04-05T05:29:44.693 回答
0

节点光纤怎么样?试试这个。

像这个链接这样的好例子:mongo-model example

和方法synchronize util编写的咖啡脚本

于 2013-04-05T06:06:41.233 回答
0

好的,知道了....需要从内部步行调用中调用完成。

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
    }
  });
};
于 2013-04-05T17:32:27.727 回答