将递归承诺的结果添加到数组中

Add results of recursive promises to array

本文关键字:数组 添加 结果 递归 承诺      更新时间:2023-09-26

我有一系列递归承诺,它们遍历层次结构,获得当前节点的父节点,直到它到达顶部。我可以很好地得到结果,但我不知道如何存储结果。我正在使用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
            }
        });
    };
};

您将需要更改您的语句以返回并添加第二个函数到chain,以便对这些promise的响应进行处理。

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
});

假设在没有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);
    }));
}