JavaScript:具有Promise的递归函数,resolve返回“未定义”

时间:2018-08-07 06:26:14

标签: javascript recursion promise

我有一个递归函数,它返回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
    })
}

我正在努力让代表的所有子孙及其代表的子孙(如果有)全部退还。

我做错了什么?

任何帮助将不胜感激。

谢谢。

2 个答案:

答案 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。未经测试,请根据所需逻辑进行修改。