我有一个递归函数,它返回promise,在满足条件的情况下,解析将触发某些条件。但是解析总是返回未定义的。
代码如下:
var children = [];
var temp = [];
function getRelationsOfRep(repId) {
var index;
return new Promise(function (resolve, reject) {
return RepRelation.findOne({_id: repId}).then(function (repData) {
if (<condition>) {
temp = temp.concat(repData.children);
temp.forEach(function (childId) {
return getRelationsOfRep(childId);
});
} else {
// else
}
if (<another condition>) {
return resolve(children);
}
}).catch(function (error) {
return reject(error);
})
})
}
function updateRepData(id){
children = [];
temp = [];
getRelationsOfRep(id).then(function (branchesData) {
console.log('branchesData:: ', branchesData); // it prints undefined
})
}
我正在努力让代表的所有子孙及其代表的子孙(如果有)全部退还。
我做错了什么?
任何帮助将不胜感激。
谢谢。
答案 0 :(得分:1)
您使事情变得有些复杂。我认为您想要实现的是使用Promise从递归函数返回结果。 这是一个更干净的版本
更清洁的解决方案-
getRelationsOfRep(repId) {
return new Promise( function(resolve,reject) {
recursiveFunctionCall(repId);
function recursiveFunctionCall(repId) {
//your recursive function logic
recursiveFunctionCall(childId);
if(...) //edge case condition
resolve('your-answer');
else
reject('your-error')
}
});
这样,您将只使用一个promise并在递归函数解析后返回。
答案 1 :(得分:0)
使用Promise.all()捕获循环中的所有诺言。
代替:
temp.forEach(function (childId) {
return getRelationsOfRep(childId);
});
尝试:
var promisesArray = [];
temp.forEach(function (childId) {
promisesArray.push(getRelationsOfRep(childId));
});
return Promise.all(promisesArray);
使用类似的方法,您将能够获得递归调用的嵌套响应。
P.S。未经测试,请根据所需逻辑进行修改。