我正在使用Parse.com来存储我的应用程序的数据,而我目前仍然坚持使用一些嵌套的承诺。我对这个概念很陌生,我写道:
this.loadCategories = function() {
var global = ParseService.toAngularPromise(new Parse.Query(Categories).find());
global.then(function(categories){
return categories.forEach(function (category){
var criteriaPerCategory = ParseService.toAngularPromise(category.relation('relevantCriteria').query().find());
return criteriaPerCategory.then(function (allCriteriaPerCategory){
category._criteria = allCriteriaPerCategory;
});
});
});
return global;
};
它几乎可以工作......所有的承诺都会被执行,除了最后一个:这应该在视图加载到Angular之前调用它基本上有效,除了在创建视图后调用行category._criteria = allCriteriaPerCategory;
我不明白为什么。
我知道这种写承诺的风格不是很有学术性,但由于这个清单,我找不到更好的解决方案......我很乐意对我的代码有所了解!
ParseService
只是一个从普通JS Promises创建Angular Promises的服务。
答案 0 :(得分:2)
你的循环只是向风中启示承诺,没有链接。您需要堆叠所有这些承诺,然后检查所有这些承诺何时完成。这可以通过map
和$q.all
轻松完成。你只需要注入那种依赖。
this.loadCategories = function() {
var global = ParseService.toAngularPromise(new Parse.Query(Categories).find());
return global.then(function(categories){
return $q.all(categories.map(function (category){
var criteriaPerCategory = ParseService.toAngularPromise(category.relation('relevantCriteria').query().find());
return criteriaPerCategory.then(function (allCriteriaPerCategory){
category._criteria = allCriteriaPerCategory;
return category;
});
}));
});
};
答案 1 :(得分:1)
经过一段时间后,我改变了策略并最终得到了:
this.loadCategories2 = function () {
function loadAllData(category) {
var relatedCriteria = category.relation('relevantCriteria').query().find().then(function (criteria) {
category._criteria = criteria;
return category;
});
return $q.when(relatedCriteria);
}
return ParseService.toAngularPromise(new Parse.Query(Categories).find()).then(function (categories) {
return $q.all(categories.map(loadAllData))
})
}
我对这个答案的评论很感兴趣,但它基本上做了我的期望:)
答案 2 :(得分:0)
试试这个:
categories.reduce(function (p, category) {
return p.then(() => ParseService.toAngularPromise(category.relation('relevantCriteria').query().find()));
}, Promise.resolve()).then(function () {
// do whatever.
});