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,说得好。编辑以包含完整的功能。