AngularJS函数执行问题 - 需要延迟执行第二个函数

时间:2014-07-14 03:02:05

标签: javascript jquery html angularjs

我正在构建一个小实用程序来处理AngularJS中用户的购物车。

以下是我的cart-service.js文件定义。

var myStoreCartService = angular.module("myStoreCartService", []);

myStoreCartService.factory('Cart', function() {
    var userCart=[];
    var cartSummary=[];

    return{

        addItemToCart: function(item) {
            userCart.push(item);  
        },  

        retrieveCart: function(){
            return userCart;
        },

        getCartSummary: function(){
            cartSummary=[];
            for (var key in userCart){
                var currentItem={"productname":"","price":""};              
                if (userCart.hasOwnProperty(key)){                      
                    currentItem["productname"]=userCart[key].productname;
                    currentItem["price"]=userCart[key].price;
                    cartSummary.push(currentItem);
                    continue;
                };
            }
            return cartSummary;
        },

        getCurrentTotal: function(){
            alert("Sum function called "+ cartSummary);
            var currentSum=0;
                for (var key in cartSummary)
                {  
                    if (cartSummary.hasOwnProperty(key))
                    {    
                        // get sum     
                        currentSum = currentSum+parseInt(cartSummary[key].price);
                        alert(currentSum+" is current sum")
                        continue;
                    };
                }
            return currentSum;
        }

    }

});

以下是用于更新页面购物车的方法。(在页面控制器中定义)

function addItemToCartHelper(data){
  Cart.addItemToCart(data);  
  $scope.cart=Cart.retrieveCart();
  $scope.cartLength=$scope.cart.length;
  $scope.userCartSummary=Cart.getCurrentTotal();
  $scope.userCartSummaryFromService=Cart.getCartSummary();
}

我的问题是我没有得到正确的价格总和,我的价格总是少加一个项目。

我确实意识到,我的总成本总和的功能应该只在我的购物车摘要更新后运行,但在我的情况下,它会在购物车摘要更新功能启动之前运行。

我需要一种方法来确保在总计函数运行之前,购物车摘要已完成执行。

1 个答案:

答案 0 :(得分:1)

对于您提到的最佳方法,您可以使用Angularjs提供的 Promise API($ q)服务。它用于同步,异步任务。与你的情况一样

Promise API用于在满足条件时履行承诺,即解决或拒绝。

您可以使用 $ q.defer()的延迟对象创建的承诺中的.then 示例:

var deferredObject = $q.defer();
var deferredPromise = deferredObject.promise;
deferredPromise.then(successCallback,errorCallback);

deferredObject.resolve() // Calls the successCallback
deferredObject.reject() // Will call errorCallback

有关更好的说明,请点击链接 - http://andyshora.com/promises-angularjs-explained-as-cartoon.html