Javascript 用承诺更新Json值
我想在Json中填充一些用角度承诺计算的值,这些值应该在某些事件后更新。 我尝试调用生成值的工厂,例如下面这样的函数,并尝试调用负责计算值的函数GetWeeklyVal和GetDailyVal:Javascript 用承诺更新Json值,javascript,json,angularjs,angular-promise,Javascript,Json,Angularjs,Angular Promise,我想在Json中填充一些用角度承诺计算的值,这些值应该在某些事件后更新。 我尝试调用生成值的工厂,例如下面这样的函数,并尝试调用负责计算值的函数GetWeeklyVal和GetDailyVal: this.salesList = {"sales":[ { "id":"A1", "dailyValue": GetDailyVal('A1'), "weeklyValue": GetWeeklyVal('A1')}, { "id":"A2", "dai
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获取值)
这是工厂
.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调用。为了处理异步请求,必须在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);
}
}
}]); 首先检查GetDailyVal()和GetWeeklyVal()是否正确执行。我分别调用这些函数,它们工作并产生正确的值,但当我尝试加载基于Json的网格时,它将不再工作。你能给我看更多的代码吗?检查这篇文章,也许这会给你一个线索:我可以从Json中获取其余的值,并将它们加载到我的网格中。问题在于如何获得承诺的价值。我应该把计算值的代码部分也放进去吗?GetDailyVal和GetWeeklyVal是否从api获取值?我知道为什么它不起作用,因为控制器中没有关于GetDailyVal和GetWeeklyVal的承诺。不过,我不知道如何在json对象中添加承诺……最好的方法是在循环中分别加载dailyValue和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);
}