【问题标题】:Add results of recursive promises to array将递归承诺的结果添加到数组
【发布时间】:2014-10-29 08:39:51
【问题描述】:

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

【问题讨论】:

  • 如果这是异步代码,您需要返回承诺以允许.then() 完成其工作,并让您能够通过承诺返回最终数据。 dataRetriver.getNodeData() 返回什么?
  • 总是 return 来自异步函数的承诺!
  • @jfriend00 getNodeData 仅使用具有该叶子详细信息的对象进行解析。
  • 用对象解析?这是否意味着它会返回一个承诺?隐藏getNodeData() 的实现细节并不能帮助任何人在这里帮助你。如果我从一开始就知道它做了什么,我会在你提出问题的一个小时内发布一个答案,但因此,我仍然对它的了解不够,无法发布一个不是猜测的答案。你必须帮助人们帮助你,而忽略重要的实施细节并不能帮助人们理解你想要做什么。

标签: javascript recursion promise bluebird


【解决方案1】:

您将需要更改您的语句以返回并添加第二个函数到链中以对来自这些承诺的响应做一些事情。

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

【讨论】:

  • 我现在要退回这些,但在我的 getParent.then 中,我只收到树的顶部叶子 - 我需要整条线沿着树向上。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 2017-08-04
    • 2016-09-14
    • 2014-02-04
    • 1970-01-01
    • 2018-12-01
    • 2018-05-29
    • 1970-01-01
    相关资源
    最近更新 更多