繁体   English   中英

Q.all的递归承诺

[英]Recursive Promises with Q.all

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

我正在构建SPA(单页应用程序)。 因此,该项目包括几个javascript库。 我是“延迟加载”微风实体。

这是我的代码。 我有两个函数可用来创建承诺数组。

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

谢谢您的帮助。

请更改getChildrenV2

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

它不仅更短,而且不会再包含任何错误。

您不会从map return任何东西。 更改为

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM