Javascript 如何使用$1.5避免竞争条件

Javascript 如何使用$1.5避免竞争条件,javascript,angularjs,Javascript,Angularjs,我有一种情况,我不希望一个承诺完成,直到另一个(或可能是其他几个)完成。在这个场景中,我有不同的支付选项,每次用户单击按钮时,都会进行支付。。。付款时,用户还可以单击删除。这导致了奇怪的竞争条件,即在支付结束之前处理删除。在支付操作完成之前,我不希望删除操作处理/点击数据库。以下是相关代码: $ctrl.deletePayment = function(paymentRecord) { PaymentsService.deletePaymentRequest($ctrl.paymentRe

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

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

您可能希望存储承诺以供参考,并在继续之前使用
$q.all(…)
确保所有内容都已完成。大致如下:

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

…调用每个方法时,都需要将其承诺添加到承诺数组。

您可能希望存储该承诺以供参考,并使用
$q.all(…)
确保在继续之前完成所有操作。大致如下:

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

…调用每个方法时,都需要将其承诺添加到承诺数组。

在完成之前不要显示按钮
ng if
。您可以在付款承诺的finally条款中添加一个标志,比如说
isPaying
,使其在付款时为true,在付款承诺的finally条款中为false。。您可以使用此标志启用/禁用“删除”按钮。在完成之前不要显示该按钮
ng if
。您可以在付款承诺的finally条款中添加一个标志,比如说
isPaying
,使其在付款时为true,在付款承诺的finally条款中为false。。您可以使用此标志启用/禁用删除按钮。