【问题标题】:Recursive Promises with Q.allQ.all 的递归承诺
【发布时间】:2014-05-06 17:41:09
【问题描述】:

这与this 问题密切相关,但是我无法成功修改/实施解决方案。

我正在构建一个 SPA(单页应用程序)。所以这个项目包括几个 javascript 库。这个特定的实例我是“延迟加载”微风实体。

这是我的代码。我有两个函数可以创建 Promise 数组。

getChildrenV2: function (entity) {
    var self = this,
        deferred = Q.defer(),
        p = entity.entityAspect.loadNavigationProperty("Children").then(function (data) {
            deferred.resolve(data);
        });
    return deferred.promise;
},

getChildren: function (entity) {
    var self = this;
    return self.getChildrenV2(entity).then(
        function (data) {
            return Q.all(data.results.map(
                function (e) {
                    console.log(e);
                    self.getChildren(e);
                }
            ));
        });
},

根据我对上面链接的 SE 问题中的解决方案的理解,我应该能够做到这一点(如下),并且所有“儿童”都将被加载。

getChildren(entity).then(function () {
    console.log("All Children have been loaded");
});

我显然误解了上面链接的 SE 的解决方案或我编写递归函数的方式。

编辑

在查看了@Bergi 和@Esailija 提供的答案后,我重构了我的代码,如下所示。

getChildren: function (entity) {
    var self = this;
    return entity.entityAspect.loadNavigationProperty("Children").then(
        function (data) {
            return Q.all(data.results.map(
                function (e) {
                    console.log(e);
                    return self.getChildren(e);
                }
            ));
        });
},

如果您注意到我删除了 getChildrenV2 函数以使 IMO 代码更简洁(接受来自 @Esailija 的缩短函数并使其更简洁的建议)。

@Bergi 解决了我最初的问题,并通过简单地返回递归函数调用 return self.getChildren(e); 来解决。

感谢您的帮助。

【问题讨论】:

  • 我错过了return 声明。 @ArtjomB。

标签: javascript recursion breeze promise


【解决方案1】:

请改getChildrenV2

getChildrenV2: function (entity) {
    return entity.entityAspect.loadNavigationProperty("Children");
}

它不仅更短,而且不会再吞下任何错误。

【讨论】:

  • 哎呀。我怎么能错过呢。
【解决方案2】:

你没有return 来自你的map 的任何东西。改成

… data.results.map(function (e) {
    console.log(e);
    return self.getChildren(e);
//  ^^^^^^
}) …

除了那个小问题,它看起来不错应该可以工作。不过请注意@Esailija 的回答。

【讨论】:

  • /facepalm.谢谢@Bergi
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多