使用承诺更新 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);
      }

} }]);