递归未超过第一级

时间:2019-03-15 07:49:22

标签: javascript recursion mongoose

我在JS中进行递归时遇到了麻烦,我不确定为什么我的代码不会终止。我有一个遍历法院列表的猫鼬模式,每个法院都有用户(然后使用这些用户使用其他模式搜索签名)。我想将所有用户从输入的级别返回到最低级别的对象。这是我的代码:

    async function recurCourtUsers(username) {
        ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().then(async function(courts) {
          let level = courts.level;
          let courtName = courts.orgName.substring(0,2);
          let result = await searchModule.findCourt(courtName, level); // returns an object

          if (level === 4) {
            console.log('now at lvl4')
            console.log(result); 

          } else {
            level++
            var temp = await searchModule.findCourt(courtName, level);
            console.log(temp); 
            result.courts.concat(temp.courts);
            result.collections.concat(temp.collections);
            recurCourtUsers(courts.users[0].userName);
          }          
        });
      }
      recurCourtUsers(req.body.username);

我认为searchModule.findCourt()中没有任何不正确的地方,因为它只是找到法院并获取签名,返回一个看起来像

的对象
{
  courts: [{courtObjects}] //array of court Objects
  collection: [] //array of users that have signatures
}

// a courtObject looks like this:

{
   _id: objectId,
   orgName: "NY court"
   level: 3 // there are up to 4 levels, 1 being the "highest" or start
   users: [{userName: "15z", displayName: "court2"}]
}

我的问题是,如果我从2级开始,此功能将继续打印所有3级球场。我想从第2层开始打印所有法院(存储在result变量中),然后到第3层,最后到第4层。但是此功能只是停留在下一个层上,似乎从不增加一次递归后的level变量。另外,我应该返回任何内容(例如结果变量)吗?我应该使用蓄电池吗?

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我将尽力解释我的理论,让我知道是否合理:

在这里,我已注释掉不影响递归调用的每一行:

async function recurCourtUsers(username) {
    ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().then(async function(courts) {
      let level = courts.level;
      // let courtName = courts.orgName.substring(0,2);
      // let result = await searchModule.findCourt(courtName, level); // returns an object

      if (level === 4) {
        console.log('now at lvl4')
        console.log(result); 

      } else {
        // level++
        // var temp = await searchModule.findCourt(courtName, level);
        // console.log(temp); 
        // result.courts.concat(temp.courts);
        // result.collections.concat(temp.collections);
        recurCourtUsers(courts.users[0].userName);
      }          
    });
}
recurCourtUsers(req.body.username);

为清楚起见,让我将其删除:

async function recurCourtUsers(username) {
    ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().then(async function(courts) {
      let level = courts.level;

      if (level === 4) {
        console.log('now at lvl4')
        console.log(result); 
      } else {
        recurCourtUsers(courts.users[0].userName);
      }          
    });
}
recurCourtUsers(req.body.username);

如果您注意这一点,您似乎正在使用法院发现的第一位用户使用该用户名。这使我想到,当您再次调用该方法时:courts.users[0].userName === req.body.username

这可能会使您陷入无限循环。