我正在使用 Parse.com 来存储我的应用程序的数据,但目前我陷入了一些嵌套的 promise 。我对这个概念很陌生,我写道:
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;
};
它几乎可以工作......除了最后一个之外,所有 promise 都被执行:这应该在 View 加载到 Angular 之前调用,它基本上可以工作,除了行 category._criteria = allCriteriaPerCategory;
创建 View 后调用,我不明白为什么。
我知道这种编写 Promise 的风格不是很学术,但由于这个列表,我没有找到任何更好的解决方案...我很高兴获得有关我的代码的一些见解!
ParseService
只是一个从普通 JS Promises 创建 Angular Promises 的服务。
最佳答案
你的循环只是将 promise 抛入风中,没有进行任何链接。您需要堆叠所有这些 promise ,然后检查所有这些 promise 何时完成。这可以通过 map
和 $q.all
轻松完成。您只需要注入(inject)该依赖项即可。
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;
});
}));
});
};
关于javascript - 带列表的嵌套 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33104988/