【发布时间】:2018-05-31 10:46:31
【问题描述】:
我是编写和使用 Promise 的新手,我想要一些建议。我必须链接我的承诺,因为某些功能只能在其他功能之后运行。我确实曾经用很多回调函数来处理这个问题,这看起来非常混乱和混乱。但是随着我正在做的链接......它开始看起来又有点乱了,我想知道我是否正确地这样做......
function calcNetPriceSaleCharge(theItem) {
var setInitialChargeAmount = miscSaleSvc.getInitialCharge(theItem);
var setDiscountAmount = miscSaleSvc.getDiscountAmount(theItem);
$q
.all([setInitialChargeAmount, setDiscountAmount])
.then(function(values) {
theItem.initialchargeamount = values[0];
theItem.initialdiscountamount = values[1];
})
.then(function() {
var setActualCharge = miscSaleSvc.getActualCharge(theItem);
var setVat = miscSaleSvc.setVat(theItem);
$q
.all([setActualCharge, setVat])
.then(function(values) {
theItem.actualcharge = values[0];
theItem.vat = values[1];
})
.then(function() {
var setTotal = miscSaleSvc.getSaleTotal(theItem);
$q
.all([setTotal])
.then(function(values) {
theItem.total = values[0];
})
.catch(function(error) {
console.log(error);
});
})
.catch(function(error) {
console.log(error);
});
})
.catch(function(error) {
console.log(error);
});
}
这确实有效,但我不确定我是否以正确的方式去做!正在调用的示例函数是 this...
srv.getInitialCharge = function(theItem) {
//set up the deferred var
var deferred = $q.defer();
var initialchargeamount = parseFloat(theItem.normalperiodcharge * theItem.quantity);
if (isNaN(initialchargeamount)) {
deferred.reject("Error when calculating Initial Charge Amount.");
} else {
//set up the failed result
deferred.resolve(initialchargeamount);
}
//return the promise
return deferred.promise;
};
提前感谢您的帮助:)
【问题讨论】:
-
更简洁的方式是使用
async/await。你也不需要嵌套 Promises。您可以从回调中返回$q.all()之类的内容并继续外链。 -
@Sirko
async/await使用未与 AngularJS 框架及其 $q 承诺集成的 ES6 承诺。只有在 AngularJS 执行上下文中应用的操作才能受益于 AngularJS 数据绑定、异常处理、属性监视等。 -
请记住,您可以使用
$q.reject和$q.when创建拒绝/履行的承诺。不需要使用$q.defer()。
标签: javascript angularjs angular-promise ecmascript-5