使用承诺更新 Json 个值
Updating Json values with a promise
我想在 Json 中填充一些值,这些值是用 angular-promises 计算的,这些值应该在某些事件发生后更新。
我尝试调用产生值的工厂,例如如下所示,并尝试调用负责计算值的函数 GetWeeklyVal 和 GetDailyVal :
this.salesList =
{"sales":[
{ "id":"A1", "dailyValue": GetDailyVal('A1'), "weeklyValue": GetWeeklyVal('A1')},
{ "id":"A2", "dailyValue": GetDailyVal('A2'), "weeklyValue": GetWeeklyVal('A2')}
]}
在我的控制器中我有:
$scope.sales= salesServices.salesList.sales;
但是没用。值保持为零,这是应用程序中的默认值。
为什么不更新这些值,什么是更好的解决方案?
更新
这是我调用计算函数的代码部分:(我跳过这部分以根据此处传递的 id 获取值)
function GetDailyVal(id){
var dValue = 0;
salesService.getSales();
dValue = salesService.totalAmount;
return dValue;
}
这是工厂
.factory('salesService', ['$http', '$q'],
function salesInvoiceService($http, $q) {
var service = {
sales: [],
getSales: getSales,
totalAmount: 0
};
return service;
function getSales() {
var def = $q.defer();
var url = "http://fooAPI/salesinvoice/SalesInvoices"; //+ OrderDate filter
$http.get(url)
.success(function(data) {
service.sales = data.d.results;
setTotalAmount(service.sales);
def.resolve(service.sales);
})
.error(function(error){
def.reject("Failed to get sales");
})
.finally(function() {
return def.promise;
});
}
function setTotalAmount(sales){
var sum = 0;
sales.forEach(function (invoice){
sum += invoice.AmountDC;
});
service.totalAmount = sum;
}
})
它不起作用的原因是:
dailyValue: GetDailyVal('A1')
此处,GetDailyVal 对 api 进行异步 ajax 调用。为了处理异步请求,您必须 return 在您的 GetDailyVal 函数中做出如下承诺:
function GetDailyVal() {
salesService.getSales().then(function(data) { //promise
dValue = salesService.totalAmount;
return dValue;
})
}
weeklyValue 也需要做同样的事情。
我认为您的代码中存在一些错误。
我在这里给出一些示例代码。我想这会对你有所帮助。
这是我的一个应用程序中的示例代码。检查一下。
service.factory('Settings', ['$http','$q', function($http,$q) {
return {
AcademicYearDetails : function(Details) {
return $http.post('/api/academic-year-setting', Details)
.then(function(response) {
if (typeof response.data === 'object') {
return response.data;
} else {
return $q.reject(response.data);
}
}, function(response) {
return $q.reject(response.data);
});
},
newUser : function(details) {
return $http.post('/api/new-user', details);
}
}
}]);
我想在 Json 中填充一些值,这些值是用 angular-promises 计算的,这些值应该在某些事件发生后更新。 我尝试调用产生值的工厂,例如如下所示,并尝试调用负责计算值的函数 GetWeeklyVal 和 GetDailyVal :
this.salesList =
{"sales":[
{ "id":"A1", "dailyValue": GetDailyVal('A1'), "weeklyValue": GetWeeklyVal('A1')},
{ "id":"A2", "dailyValue": GetDailyVal('A2'), "weeklyValue": GetWeeklyVal('A2')}
]}
在我的控制器中我有:
$scope.sales= salesServices.salesList.sales;
但是没用。值保持为零,这是应用程序中的默认值。 为什么不更新这些值,什么是更好的解决方案?
更新
这是我调用计算函数的代码部分:(我跳过这部分以根据此处传递的 id 获取值)
function GetDailyVal(id){
var dValue = 0;
salesService.getSales();
dValue = salesService.totalAmount;
return dValue;
}
这是工厂
.factory('salesService', ['$http', '$q'],
function salesInvoiceService($http, $q) {
var service = {
sales: [],
getSales: getSales,
totalAmount: 0
};
return service;
function getSales() {
var def = $q.defer();
var url = "http://fooAPI/salesinvoice/SalesInvoices"; //+ OrderDate filter
$http.get(url)
.success(function(data) {
service.sales = data.d.results;
setTotalAmount(service.sales);
def.resolve(service.sales);
})
.error(function(error){
def.reject("Failed to get sales");
})
.finally(function() {
return def.promise;
});
}
function setTotalAmount(sales){
var sum = 0;
sales.forEach(function (invoice){
sum += invoice.AmountDC;
});
service.totalAmount = sum;
}
})
它不起作用的原因是:
dailyValue: GetDailyVal('A1')
此处,GetDailyVal 对 api 进行异步 ajax 调用。为了处理异步请求,您必须 return 在您的 GetDailyVal 函数中做出如下承诺:
function GetDailyVal() {
salesService.getSales().then(function(data) { //promise
dValue = salesService.totalAmount;
return dValue;
})
}
weeklyValue 也需要做同样的事情。
我认为您的代码中存在一些错误。
我在这里给出一些示例代码。我想这会对你有所帮助。
这是我的一个应用程序中的示例代码。检查一下。
service.factory('Settings', ['$http','$q', function($http,$q) {
return {
AcademicYearDetails : function(Details) {
return $http.post('/api/academic-year-setting', Details)
.then(function(response) {
if (typeof response.data === 'object') {
return response.data;
} else {
return $q.reject(response.data);
}
}, function(response) {
return $q.reject(response.data);
});
},
newUser : function(details) {
return $http.post('/api/new-user', details);
}
} }]);