2017-01-20 2 views
0

У меня есть ситуация, когда я не хочу, чтобы одно обещание закончилось, пока не будет завершен другой (или, возможно, несколько других). в этом случае у меня разные варианты оплаты, и каждый раз, когда пользователь нажимает кнопку, происходит оплата ... пока платежи сделаны, пользователь также может нажать кнопку «Удалить». это приводит к странным условиям гонки, когда удаление обрабатывается до завершения выплаты. Я не хочу, чтобы удаление обрабатывало/удаляло базу данных до тех пор, пока действия оплаты не будут завершены. Вот соответствующий код:

$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); 
    } 
} 

Как я могу предотвратить удаление платежа с момента покупки до того, как действие платежа будет завершено? Я думал о том, что у меня модальное шоу, чтобы блокировать пользовательский интерфейс, но также интересовался, есть ли угловой способ справиться с этим условием асинхронности/гонки.

+0

Не показывайте кнопку, пока она не будет завершена. 'Нг-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) ]; 
    }); 
} 

... каждый метод должен будет добавить свое обещание к массиву обещаний при вызове.