2014-09-30 3 views
4

Я делаю простое угловое приложение для управления доходами. Доходы поступают из проектов, которые я храню в json (для целей тестирования).Угловое обслуживание, вызывающее другое обслуживание

Итак, в основном, я использую услугу в Angular, чтобы получить этот json, и я хотел бы получить еще одну услугу, которая вызывает службу проектов и фильтрует доходы от каждого проекта.

Вот код:

facturateApp.service('Projects', function($http){  


var Projects = { 
     async: function() { 

     var promise = $http.get('base.json').then(function (response) {    
      return response.data; 
     }); 
     return promise; 
     } 
    }; 
    return Projects; 


}); 

facturateApp.service('Incomes', function(Projects){  
    var incomes = []; 
    Projects.async().then(function(d) { 
     var projects = d; 

     angular.forEach(projects, function(project){ 

     if(typeof(project.account.accountAmount) == 'number' && project.account.accountAmount > 0){ 
      var newIncome = {}; 
      newIncome.projectName = project.projectName; 
      newIncome.clientName = project.clientName; 
      newIncome.typeIncome = "Accompte"; 
      newIncome.amount = project.account.amountAccount; 
      newIncome.date = project.account.accountDate; 
      newIncome.notes = project.account.accountType; 
      incomes.push(newIncome); 


     } 



     }); 
     angular.forEach(projects, function(project){ 


     if (typeof(project.total.totalAmount) == 'number' && project.total.totalAmount > 0){ 
      var newIncome = {}; 
      newIncome.projectName = project.projectName; 
      newIncome.clientName = project.clientName; 
      newIncome.typeIncome = "Accompte"; 
      newIncome.amount = project.total.totalAmount; 
      newIncome.date = project.total.totalDate; 
      newIncome.notes = project.total.totalType; 
      incomes.push(newIncome); 


     } 


     }); 

    }); 
    console.log(incomes); // still returns []; 
    return incomes; 

}); 

Моя проблема заключается в том, что последний журнал возвращает пустой массив. На самом деле он работает так, как предполагалось: incomes возвращается до Projects.async().then(function(d).

Но я не знаю, ждать эту функцию, которая будет выполняться перед возвращением incomes в сервис, который называют еще одна услуга ...

Любая помощь?

ответ

3

Как работает асинхронный вызов: если данные службы Incomes заполняются способом async, поэтому он также должен возвращать обещание.

Я хотел бы создать какой-то метод buildAndGetIncomes, который будет вызывать Projects.async() и когда данные извлекаются -> вернуть новое обещание контроллера:

facturateApp.service('Incomes', function(Projects, $q){ 

    var self = this; 

    var deferred = $q.defer();  
    var incomes = []; 

    self.buildAndGetIncomes = function(){ 

     Projects.async().then(function(d) { 
     var projects = d; 

     angular.forEach(projects, function(project){ 

     if(typeof(project.account.accountAmount) == 'number' && project.account.accountAmount > 0){ 
      var newIncome = {}; 
      newIncome.projectName = project.projectName; 
      newIncome.clientName = project.clientName; 
      newIncome.typeIncome = "Accompte"; 
      newIncome.amount = project.account.amountAccount; 
      newIncome.date = project.account.accountDate; 
      newIncome.notes = project.account.accountType; 
      incomes.push(newIncome); 
     } 
     }); 

     angular.forEach(projects, function(project){ 


     if (typeof(project.total.totalAmount) == 'number' && project.total.totalAmount > 0){ 
      var newIncome = {}; 
      newIncome.projectName = project.projectName; 
      newIncome.clientName = project.clientName; 
      newIncome.typeIncome = "Accompte"; 
      newIncome.amount = project.total.totalAmount; 
      newIncome.date = project.total.totalDate; 
      newIncome.notes = project.total.totalType; 
      incomes.push(newIncome); 
     } 
     }); 

    deferred.resolve(incomes);  
    }); 

    return deferred.promise;  
    };  
}); 

и от контроллера мы называем:

Incomes.buildAndGetIncomes().then(function(incomes) { 
    // ... 
}, function(error) { 
    // .. 
}); 
+0

Можно ли есть что-то проще назвать в контроллере (я имею в виду что-то вроде «Доходы», которое возвращает массив «доходы»)? – enguerranws

+0

@enguerranws ​​'Incomes.buildAndGetIncomes.' будет возвращать массив доходов. довольно простой. Другой способ, если вы хотите, реализовать цепочку обещаний на стороне контроллера, но, как вы пожелаете –

+0

Хорошо, спасибо за ваш ответ. Ошибка в вашем коде: Incomes.buildAndGetIncomes(). Then (function (d) {} ​​ – enguerranws

Смежные вопросы