2015-10-13 5 views
0

Я использую 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; 
    }; 

Это почти работает ... Все обещания становятся выполнены, кроме последней: это должно быть вызвано до видовых нагрузок в угловом и она в основном работает за исключением того, что строка category._criteria = allCriteriaPerCategory; вызывается после создания представления, и я не понимаю, почему.

Я знаю, что этот стиль для написания обещаний не очень академичен, но я не нашел лучшего решения из-за этого списка ... Я был бы очень рад получить некоторые сведения о моем коде!

ParseService - это услуга, которая создает Угловые обещания от обычных обещаний JS.

+0

'return' from' global.then' is 'categories' .... возвращение к' forEach' не делает вещь. Если вам нужны все, чтобы завершить, вероятно, понадобится '$ q.all()' – charlietfl

ответ

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)) 
    }) 
    } 

Я очень заинтересован в комментарии для этого ответа, но в основном делает то, что я ожидал :)

+0

Я думаю, вы должны сделать категорию categoryToAdd._criteria = [1]; return categoryToAdd; 'part right в обратном вызове' then' в 'loadAllData'. Таким образом вам не нужно возвращать '$ q.all ([$ q.when (category), relatedCriteria])' – Bergi

+0

Но 'loadAllData' не является частью обработчика' then'. Это функция отображения, чтобы складывать обещания. – MinusFour

+0

@ Bergi Я сделал ваши изменения, и он все еще работает! Я только что отредактировал свой ответ. Большое спасибо –

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; 
     }); 
    })); 
    }); 
}; 
+0

Эй, спасибо, можете ли вы просто объяснить, что делает функция карты? –

+0

Это дает вам множество ваших возвращенных обещаний. Это буквально сводит ваши обещания в новый массив. Которая затем используется '$ q.all' для разрешения, как только каждое обещание выполняет. – MinusFour

+0

Хм, я понимаю, что вы сделали, но у меня все еще нет последней строки ('category._criteria = allCriteriaPerCategory;') до создания представления (но она очень хорошо работает после создания представления). –

0

Попробуйте это:

categories.reduce(function (p, category) { 
    return p.then(() => ParseService.toAngularPromise(category.relation('relevantCriteria').query().find())); 
}, Promise.resolve()).then(function() { 
    // do whatever. 
}); 
Смежные вопросы