javascript - 递归未超过第一级

标签 javascript recursion mongoose

我在 JS 中遇到递归问题,并且不确定为什么我的代码不会终止。我有一个 Mongoose 模式,它遍历法院列表,每个法院都有用户(然后我用它来使用另一个模式搜索签名)。我想返回一个对象,其中包含从输入级别到最低级别的所有用户。这是我的代码:

    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 级(存储在结果变量中)开始的所有法庭,然后转到第 3 级,最后转到第 4 级。但是这个函数只是卡在下一个级别,并且似乎永远不会增加一次递归后的级别变量。另外,我应该返回任何东西(比如结果变量)吗?我应该使用累加器吗?

有什么建议吗?谢谢!

最佳答案

我会尝试解释我的理论,让我知道它是否有意义:

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

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

这可能就是让你陷入无限循环的原因。

关于javascript - 递归未超过第一级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55177870/

相关文章:

Javascript : natural sort of alphanumerical strings

javascript - 通过从字符串评估 JavaScript 来取消字符串

javascript - 在 jQuery.post 上,我收到消息 : The method GET is not allowed for the requested URL

node.js - Mongoose 模型是另一个模型的 post hook 内的空对象

javascript - 在 Firefox : "AccessControlException" 中使用 requires.js 加载文本文件失败

c++ - 递归模板函数在初始化时导致负数组大小

recursion - Clojure Koan 阶乘函数实现

node.js - Mongoose 聚合与 geonear

node.js - Nodejs Mongoose - 模型未定义

java - 缺少返回语句(Java)