Javascript 角度服务调用另一个服务
我正在制作一个简单的角度应用程序来管理收入。收入来自我存储在json中的项目(用于测试目的) 所以,基本上,我使用Angular中的一个服务来获取这个json,我希望有另一个服务调用Projects服务并过滤每个项目的收入 代码如下:Javascript 角度服务调用另一个服务,javascript,angularjs,Javascript,Angularjs,我正在制作一个简单的角度应用程序来管理收入。收入来自我存储在json中的项目(用于测试目的) 所以,基本上,我使用Angular中的一个服务来获取这个json,我希望有另一个服务调用Projects服务并过滤每个项目的收入 代码如下: facturateApp.service('Projects', function($http){ var Projects = { async: function() { var promise = $http.ge
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;
});
我的问题是最后一个日志返回一个空数组。实际上,它的工作原理是:在Projects.async()之前返回incomers
,然后执行(函数(d)
)
但我不知道在调用另一个服务的服务中返回incomers
之前,是否要等待此函数执行
有什么帮助吗?这就是异步调用的工作原理:如果
服务数据以异步方式填充,那么它也必须返回承诺
我将创建一些方法buildandgetIncomers
,该方法将调用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) {
// ..
});
是否可以在控制器中使用更简单的方法来调用它(我指的是返回“Incomers”数组的类似“Incomers”的方法)?@enguerranwsincomers.buildandGetIncomers.
将返回Incomers数组。非常简单。如果您愿意,可以用其他方法在控制器端实现承诺链,但如您所愿,感谢您的回答。代码中有一个小错误:incomers.buildandGetIncomers()。然后(函数(d){}@enguerranws where?:),无论如何,我已将d
更改为incomers
,但如果您发现问题,您可以编辑并修复。谢谢,我编辑了您的答案(在控制器部分/incomes.buildAndGetIncomes.then(函数(incomes)>incomes.buildAndGetIncomes()。然后(函数(incomes))