#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
.
Вероятно, это то, что удерживает вас в бесконечном цикле.