我在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级球场。我想打印从第二级开始的所有法庭(存储在result变量中),然后转到第三级,最后转到第四级。但是这个函数只是停留在下一级,并且在一次递归后似乎永远不会增加level变量。另外,我应该返回任何东西(比如result变量)吗?我应该使用累加器来代替吗?
有什么建议吗?谢谢!
发布于 2019-03-15 16:51:06
我会试着解释我的理论,让我知道它是否有意义:
在这里,我注释掉了不影响递归调用的每一行:
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。
这可能就是让你陷入无限循环的原因。
https://stackoverflow.com/questions/55177870
复制相似问题