这与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);
即可解决。
感谢您的帮助。
答案 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的答案。