带有列表的嵌套Promise

时间:2015-10-13 14:13:00

标签: javascript angularjs parse-platform promise

我正在使用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的服务。

3 个答案:

答案 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.
});