我有一种情况,我不希望一个承诺完成,直到另一个(或可能是其他一些)完成。在这种情况下,我有不同的付款选项,每次用户点击一个按钮,都会付款...付款时,用户也可以点击删除。这导致了奇怪的竞争条件,在付款完成之前处理删除。在付款操作完成之前,我不希望删除处理/命中数据库。以下是相关代码:
$ctrl.deletePayment = function(paymentRecord) {
PaymentsService.deletePaymentRequest($ctrl.paymentRecord.id, paymentRecord)
.then(updateTotal)
.catch(updateTotal);
}
$ctrl.payOff = function(dataItem) {
let payOffRecords = dataItem.payoffRecords;
PaymentsService.submitPaymentRequestViaPatch($ctrl.temporaryPaymentAdvice.id, payOffRecords)
.then(updateTotal)
.catch(updateTotal);
}
$ctrl.payAllInView = function(payOff) {
let paymentRecords = dataSource.map((rowItem) => {
return rowItem.payoffRecords;
});
if (paymentRecords.length > 0) {
PaymentsService.submitPaymentRequestViaPatch($ctrl.temporaryPaymentAdvice.id, paymentRecords)
.then(updateTotal)
.catch(updateTotal);
}
}
如何在付款操作完成之前阻止deletePayment处理?我想有一个模态显示来阻止UI,但也想知道是否有一种角度方式来处理这种异步/竞争条件。
答案 0 :(得分:3)
您可能希望存储承诺以供参考,并使用$q.all(...)
确保一切都完整,然后再继续。有点像:
let promises = [];
$ctrl.deletePayment = function(paymentRecord) {
$q.all(promises).then((values) => {
promises = [ PaymentsService.deletePaymentRequest(...)
.then(updateTemporaryPaymentAdviceTotal)
.catch(updateTemporaryPaymentAdviceTotal) ];
});
}
...每个方法都需要在调用时将其promise添加到promises数组中。