Javascript AngularJS:包含承诺和非承诺数据的函数

Javascript AngularJS:包含承诺和非承诺数据的函数,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我有一个函数,它包含的数据是承诺数据和简单数学值的组合。下面是函数: _getTotalPrice = function() { var price = 0; // Simple Math data. // Calculate price for channels first. price = price + ( num_channels - 5 )*( 4); var

我有一个函数,它包含的数据是承诺数据和简单数学值的组合。下面是函数:

_getTotalPrice = function() {

            var price = 0;
            // Simple Math data.
            // Calculate price for channels first. 
            price = price + ( num_channels - 5 )*( 4);


            var themepacks = cart.themepacks;
            if(themepacks) {
                angular.forEach(themepacks, function(pack, index) {

                // data coming from a service
                channelFactory.getThemePack(pack).then(function(result) {
                    price = price + Number(result.packPriceAmt);
                    console.log("price", price);
                  });
              });
            }

          console.log(" Total price", price);
          return price; 
 };
加载页面时,
Total price
price
的值不同。这是因为
价格
是在承诺解决后加载的。我如何才能等到承诺解决后再返回价值?我是否在此函数中创建另一个承诺?

尝试以下操作:

_getTotalPrice = function() {

            var price = 0;
            // Simple Math data.
            // Calculate price for channels first. 
            price = price + ( num_channels - 5 )*( 4);


            var themepacks = cart.themepacks;
            if(themepacks) {
                angular.forEach(themepacks, function(pack, index) {

                // data coming from a service
                return channelFactory.getThemePack(pack).then(function(result) {
                    price = price + Number(result.packPriceAmt);
                    return $q.when(price);
                  });
              });
            }
            else{
              return $q.when(price);
            }
 };

 _getTotalPrice().then(function(price){
   console.log(price);
 });

这将是一个异步函数。

函数本身必须返回一个总价承诺,该总价取决于所创建承诺的所有(
all
)分辨率

首先,一点保理将有助于清理:

// return a promise for a theme pack price
function priceOfPack(pack) {
    return channelFactory.getThemePack(pack).then(function(result) {
        return Number(result.packPriceAmt);
    });
}
这使得我们将异步收集一组价格的想法更加清晰。现在循环更简单了

_getTotalPrice = function() {
    var themepacks = cart.themepacks || [];
    var promises = [];
    angular.forEach(themepacks, function(pack, index) {
        promises.push(priceOfPack(pack));
    });
    var basePrice = (num_channels - 5) * 4;

    // when all promises are resolved, they will be with an array of prices
    return $q.all(promises).then(function(result) {
        return result.reduce((a, b) => { a + b }, basePrice);
    });
}
调用方必须意识到新函数返回一个承诺并相应地进行更改,因此

_getTotalPrice().then(function(result) {
    // result is the totalPrice
});

你看过$q吗?请参阅或任何其他示例。您迫不及待地要在函数中返回一个值。它要么以
return
返回,要么以隐式返回的形式返回
undefined
。返回一个承诺,该承诺返回一个值。在forEach内部返回什么都不做,您需要由该循环创建的承诺数组。解决方案将不起作用,我错过了他有forEach,所以你需要使用它:返回$q.all(承诺)。然后(函数(结果){angular.forEach(结果,函数(结果){price=price+Number(result.packpriceam);});返回$q.when(price);});我是她不是他。如果(!themepacks),那怎么办?@charlietfl,是的,我没有提供完整的“获取总价格”方法。只是与承诺相关的部分。猜测OP不知道他们需要为其他人返回另一个承诺condition@charlietfl,说得好。编辑以包含完整的功能。