我在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变量。另外,我应该返回任何内容(例如结果变量)吗?我应该使用蓄电池吗?
有什么建议吗?谢谢!
答案 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
。
这可能会使您陷入无限循环。