向数组添加递归promise的结果

时间:2014-10-27 16:34:10

标签: javascript recursion promise bluebird

我有一系列递归承诺,它们遍历层次结构,获取当前节点的父节点,直到它到达顶部。我可以很好地得到结果,但我不知道如何存储结果。我正在使用Bluebird来创建getNodeData承诺。

var getParent = function(node) {
    getNodeData(node)
        .then(function(node) {
            if (term.parent) {
                getParent(node.parent);
            } else {
                //return all the nodes as an array
            }
        });
    };
};

2 个答案:

答案 0 :(得分:0)

您需要更改您的语句以返回并添加第二个函数来链接以执行来自这些承诺的响应。

var getParent = function(term, classifier) {
    return dataRetriver.getNodeData(node)
        .then(function(node) {
            if (term.parent) {
                return getParent(node.parent);
            } else {
                //return all the nodes as an array
                return node;
            }
        });
    };
};

getParent(term, classifier)
.then(function(node){
    // do stuff with the node
});

答案 1 :(得分:0)

假设在没有nodeData的情况下可以爬树,可以将过程分成两部分:

  • 遍历树以查找祖先节点
  • 扫描找到的祖先节点以收集nodeData

最后返回一个聚合承诺,该承诺将在所有nodeData到达时解析。

整个过程最好包含在另一个函数中,如下所示:

function getAncestorData(node) {
    function getParent(arr, node) {
        arr.push(node);
        if(node.parent) {
            return getParent(arr, node.parent);
        } else {
            return arr;
        }
    };
    var nodes = getParent([], node);
    var promises = nodes.map(function(node) {
        return dataRetriver.getNodeData(node);
    });
    return Promise.all(promises);
}

或更简洁:

function getAncestorData(node) {
    function getParent(arr, node) {
        arr.push(node);
        return node.parent ? getParent(arr, node.parent) : arr;
    };
    return Promise.all(getParent([], node).map(function(node) {
        return dataRetriver.getNodeData(node);
    }));
}