我在 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/