2017-01-20 9 views
0

私は、もう1つ(または潜在的にいくつかの他のもの)が完了するまで約束を完了したくないという状況があります。このシナリオでは、私は異なる支払いオプションを持っており、ユーザーがボタンをクリックするたびに支払いが行われます...支払いが行われている間に、ユーザーは削除をクリックすることもできます。これは、支払いが完了する前に削除が処理される奇妙な競合状態につながります。私は支払処理が完了するまで削除を処理したり、データベースにヒットしたりしたくありません。関連するコードは次のとおりです。

$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

ボタンが完了するまで表示しないでください。 'ng-if'。 – ChiefTwoPencils

+0

支払う間は 'isPaying'と言いますが、支払い約束の最後の節ではfalseとするフラグを追加できます。このフラグを使って削除ボタンを有効/無効にすることができます。 –

答えて

3

参考までに約束を保存し、続行する前にすべてが完了していることを確認するために$q.all(...)を使用します。

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

...各メソッドは、呼び出されたときに約束をその配列に追加する必要があります。