javascript - 如何对异步映射函数执行递归

标签 javascript mongodb algorithm graph

我有一张标签名称图,例如咖啡、鞋子等。每个标签可以有多个父项或子项。我正在用它做一棵树。我选择了那些没有父节点的节点并从那里开始遍历。我的 mongo id

  Taxonomy.find($or: [{ 'parent': { $exists: false } }]}).then((resp) => {
    Promise.all(resp.map(resp) => getChildCategories(resp.children)).then(function(results) {
        resp.children = results
        res.json({resp});
    }).catch(err => {
        console.log(err)
    });
});

但是当出现循环条件时我卡住了,比如标签有一个 child ,而那个 child 有相同的 parent ,所以它进入了循环条件。我正在使用 es5,所以没有异步等待。

var visited_nodes = {"5a8c1c966ac6cb3c078fe727" : true};

//this map keep track of visited nodes

function getChildCategories(parentCategory){
return parentCategory.map(child => {
  return new Promise((resolve,reject) => {
  if(!visited_nodes[child]){
    Taxonomy.findOne({_id : child}).then((resp) => {
       visited_nodes[child] = true;
       console.log(resp.children);
       if(resp.children && resp.children.length > 0){
           getChildCategories(resp.children)
           .map(x => x).then(childresp => {
               resp.children = childresp;
               resolve([resp]);
           })
       }else{
         resp.children = null;
         resolve(resp);
       }
    }).catch(err => {
        reject(err);
    });
   }else{
       console.log("already visited")
       return resolve({});
   }
  });
});
};

由于异步DB调用,很难做树,因为map函数在异步调用中返回null。任何人都有关于如何执行此操作的解决方案

最佳答案

你好像在找

function getCategory(category) {
  if (visited_nodes[category]) {
    console.log("already visited")
    return Promise.resolve({});
  }
  visited_nodes[category] = true;
  return Taxonomy.findOne({_id : category}).then(resp => {
    return getChildCategories(resp.children).then(children =>
      resp.children = children;
      return resp;
    });
  });
}
function getChildCategories(children) {
  console.log(children);
  if (children && children.length > 0) {
    return Promise.all(children.map(getCategory));
  } else {
    return Promise.resolve(null);
  }
}

关于javascript - 如何对异步映射函数执行递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55184176/

相关文章:

javascript - 如何在每次滚动时切换 <p> 高亮显示?

mongodb - MongoDB 中的快速相关标签搜索

javascript - 缩放嵌入内容以适合窗口? Flash 或 HTML5 视频

javascript - 参数列表后缺少 )。 (第 11 行,文件 “Code” )用于将 google excel 链接到 google 表单的代码

php - 将 Div 内容或 Canvas 保存为图像

mongodb - 如何在mongodb中取消设置后删除值为null的数组字段

javascript - 当我尝试在下面的代码中访问 db.collection 时,为什么会出现未定义的情况?

algorithm - 多短规则模式匹配算法

algorithm - 最短路径 - 广度优先搜索

algorithm - 点列表的平均矩形