如何使用$ http promises angular 1.5避免竞争条件

时间:2017-01-20 18:25:54

标签: javascript angularjs

我有一种情况,我不希望一个承诺完成,直到另一个(或可能是其他一些)完成。在这种情况下,我有不同的付款选项,每次用户点击一个按钮,都会付款...付款时,用户也可以点击删除。这导致了奇怪的竞争条件,在付款完成之前处理删除。在付款操作完成之前,我不希望删除处理/命中数据库。以下是相关代码:

 $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,但也想知道是否有一种角度方式来处理这种异步/竞争条件。

1 个答案:

答案 0 :(得分:3)

您可能希望存储承诺以供参考,并使用$q.all(...)确保一切都完整,然后再继续。有点像:

let promises = [];
$ctrl.deletePayment = function(paymentRecord) {
  $q.all(promises).then((values) => {
    promises = [ PaymentsService.deletePaymentRequest(...)
      .then(updateTemporaryPaymentAdviceTotal)
      .catch(updateTemporaryPaymentAdviceTotal) ];
  });
}

...每个方法都需要在调用时将其promise添加到promises数组中。