Рекурсия не проходит первый уровень

#javascript #recursion #mongoose

#javascript #рекурсия #мангуст

Вопрос:

У меня возникли проблемы с рекурсией в 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. Но эта функция просто застревает на следующем уровне и, похоже, никогда не увеличивает переменную уровня после одной рекурсии. Кроме того, должен ли я возвращать что-либо (например, переменную результата)? Должен ли я использовать вместо этого накопитель?

Есть предложения? Спасибо!

Комментарии:

1. ожидайте recurCourtUsers(courts.users[0].userName); поскольку он возвращает обещание

2. Только что добавлено ожидание, но оно по-прежнему продолжается вечно. Он выводит правильные корты на следующем уровне, но затем продолжает это делать.

3. не уверен, но можете ли вы попробовать изменить var temp на let temp

Ответ №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 .

Вероятно, это то, что удерживает вас в бесконечном цикле.