Javascript中的递归Promise

时间:2016-04-22 17:15:31

标签: javascript recursion promise

我正在尝试在存储在Elasticsearch中的数据集中构建关系。我目前无法返回关系的所有结果。当我运行递归函数时,它只返回它找到的第一个结果。我很难理解承诺以及如何正确地使用它们以达到我的目的。任何有助于返回所有数据的帮助将不胜感激。

单击按钮时调用server.js:

app.get('/parent/:elemName', function (req, res) {
  var elemName = req.params.elemName;
  streams.getUpstream(elemName).then(function (resp) { console.log("***** " + resp); });
});

second.js调用上一个代码示例中的getUpstream:

exports.getUpstream = function (element) {
  return getStream(element, 'parent');
};

在上面的getUpstream中调用的getStream函数:

function getStream(element, direction) {
  var stream = [];

  function climb(elementName) {
    return search.getDetails(elementName).then(function (searchResult) {
      var element = searchResult.hits.hits[0]._source.versions[0];
      var parents = element[direction];
      console.log("stream " + stream);
      // Base case
      if (!parents) return [];

      // Recursive case
      var promises = parents.map(function (parent) {
        if (!_.includes(stream, parent)) {
          console.log("inside " + parent);
          stream.push(parent);
          climb(parent);
        }
      });
      return stream;
    });
  }

  return climb(element);
}

第一个代码段调用getUpstream方法并打印出结果。 console.log最终将执行数据的res.send。该日志用于调试目的。

第二个代码片段调用getStream,仅作为从该文件外部调用该方法的桥梁。

第三个代码片段调用了一个详细信息方法,该方法为我提供了一个JSON文档,其中包含父字段,其中包含当前元素父项的所有元素的列表。如果这些父母中的任何一个不在流中,那么添加它们并寻找他们的父母。基本上,我只是试图返回一个元素的所有父项的列表(没有特定的顺序)。它可能是一个,也可能是100.

正如我上面所说,我的代码只返回元素的直接父元素,然后继续计算所有元素。不幸的是,我没有得到它最终计算的完整结果。如何返回完整的结果?

0 个答案:

没有答案