Javascript 递归未通过第一级
我在JS中遇到递归问题,我不确定为什么我的代码不会终止。我有一个mongoose模式,它遍历一个法院列表,每个法院都有用户(然后我使用另一个模式来搜索签名)。我想返回一个对象,其中包含从输入的级别到最低级别的所有用户。这是我的密码:Javascript 递归未通过第一级,javascript,recursion,mongoose,Javascript,Recursion,Mongoose,我在JS中遇到递归问题,我不确定为什么我的代码不会终止。我有一个mongoose模式,它遍历一个法院列表,每个法院都有用户(然后我使用另一个模式来搜索签名)。我想返回一个对象,其中包含从输入的级别到最低级别的所有用户。这是我的密码: async function recurCourtUsers(username) { ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().th
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。但是这个函数只是停留在下一个级别,并且在一次递归之后似乎永远不会增加级别变量。另外,我是否应该返回任何内容(如结果变量)?我应该改用累加器吗
有什么建议吗?谢谢 我会尝试解释我的理论,让我知道它是否有意义: 在这里,我已经注释掉了不影响递归调用的每一行: 异步函数recurCourtUsers(用户名){ ContactSchema.findOne({'users':{$elemMatch:{userName:userName}}}}).lean().then(异步函数(courts){ let level=法庭级别; //让courtName=courts.orgName.substring(0,2); //let result=await searchModule.findCourt(courtName,level);//返回一个对象 如果(级别==4){ console.log('现在处于lvl4') 控制台日志(结果); }否则{ //水平仪++ //var temp=await searchModule.findCourt(法院名称,级别); //控制台日志(temp); //结果法庭(临时法庭); //结果收集浓度(临时收集); recurCourtUsers(courts.users[0].userName); } }); } recurCourtUsers(请求主体用户名); 为了清楚起见,让我删除它们: 异步函数recurCourtUsers(用户名){ ContactSchema.findOne({'users':{$elemMatch:{userName:userName}}}}).lean().then(异步函数(courts){ let level=法庭级别; 如果(级别==4){ console.log('现在处于lvl4') 控制台日志(结果); }否则{ recurCourtUsers(courts.users[0].userName); } }); } recurCourtUsers(请求主体用户名); 如果你注意到这一点,你似乎是在使用法庭上第一个用户的用户名。这让我想到,当你再次调用这个方法时:
courts.users[0].userName===req.body.userName
这可能就是让你陷入无限循环的原因。等待重新协商者(courts.users[0].userName);当它返回一个承诺时,只是加上了等待,但它仍然会永远持续下去。它在下一个关卡打印出正确的球场,然后继续这样做。不确定,但你能试着改变var temp让temp