[英]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.