Q.all的递归Promise

时间:2014-05-06 17:41:10

标签: javascript recursion breeze promise

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

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

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

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);即可解决。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

请更改getChildrenV2

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

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

答案 1 :(得分:0)

你不能return来自map的任何内容。将其更改为

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

除了那个小问题,看起来不错应该有效。请注意@ Esailija的答案。