2015-10-21 1 views
1

Я пытаюсь понять, как применить инфраструктуру обещаний в случае, когда я перебираю список элементов портфеля для извлечения данных для использования в качестве графических карт и должен извлекать данные из связанных историй пользователей , Цель состоит в том, чтобы создать способ не пытаться создать экземпляр объекта диаграммы до тех пор, пока все асинхронные обратные вызовы не будут завершены. Вот фрагмент кода, иллюстрирующий, что я пытаюсь сделать - в этом примере функция обратного вызова метода getCollection() не выполняется до тех пор, пока все функции внешнего цикла не будут восстановлены.с использованием обещаний с getCollection

_.each(records, function(feature) { 
    var rname = (feature.get('Release')) ? feature.get('Release')._refObjectName: "None"; 
    //various other feature record extraction steps 
    feature.getCollection('UserStories').load({ 
     fetch: ['FormattedID', 'Name', 'InProgressDate','AcceptedDate'], 
     callback: function(stories, operation, success){ 
     Ext.Array.each(stories, function(story) { 
     var storyname = story.get('FormattedID') + ': ' + story.get('Name'); 
     // other chart data extraction steps 
     } 
     }); 
    } 
    }); 
}); 

ответ

0

Я бы проверить руководство в документации по работе с обещаниями, особенно раздел о получении иерархических данных:

https://help.rallydev.com/apps/2.0/doc/#!/guide/promises-section-retrieving-hierarchical-data

Основная идея заключается в том, чтобы сохранить массив всех обещания, представляющие загрузку магазина детской коллекции, а затем использовать Deft.Promise.all, чтобы дождаться их завершения до продолжения.

Так что-то вроде этого, на основе кода выше:

var childStoryPromises = []; 
_.each(records, function(feature) { 
    var rname = (feature.get('Release')) ? feature.get('Release')._refObjectName: "None"; 
    // various other feature record extraction steps 
    var userStoriesStore = feature.getCollection('UserStories'); 
    var promise = userStoriesStore.load({ 
     fetch: ['FormattedID', 'Name', 'InProgressDate','AcceptedDate'] 
    }); 
    childStoryPromises.push(promise); 
    feature.userStoriesStore = userStoriesStore; //save reference for later 
}); 

//wait for all stores to load 
Deft.Promise.all(childStoryPromises).then({ 
    success: function() { 
     _.each(records, function(feature) { 
      var userStories = feature.userStoriesStore.getRange(); 
      //extract user story data here 
     }); 
    }, 
    scope: this 
}); 
+0

Это похоже, что это именно то, что мне нужно! Я включу этот подход в свой код и посмотрю, что произойдет. Спасибо. – moubre

+0

Пробовал это, и это работало как шарм. Спасибо, что заставил меня обойти мой мозг! Построенный действительно сладостный график всех функций и историй для одной из наших программ. – moubre

+0

приятно! Рад, что смог помочь! –