Как мне кодировать серию обещаний, когда данные, введенные в каждое обещание, зависят от результата предыдущего обещания? - PullRequest
1 голос
/ 15 марта 2020

Пожалуйста, прочитайте запрос, прежде чем направить меня к предыдущему ответу о Promise.all или asyn c await.

Я пытаюсь зарядить несколько карт с помощью Stripe API и Promises.

В случае успешной оплаты возврат средств будет произведен другим клиентам.

Сумма сбора зависит от цены билетов, которые будут возвращены.

Некоторые сборы не удастся (у клиента недостаточно средств на кредитной карте и т. д. c), поэтому мне нужно подождать, чтобы выяснить, успешен ли платеж (обещание), или нет, прежде чем перейти к следующему платежу (обещание).

Я надеялся убедиться, что для расчета расходов используются правильные возвраты, используя сплайс в .then (), если заряд был успешным, и не используется, если платеж не был успешным.

Наконец, я планировал вызовите другие функции, когда все расходы завершены, используя код:

i===waitListToCharge.length-1

в качестве условия.

Код выполняется, но обещания, похоже, выполняются впереди, прежде чем предыдущие будут завершены, и условие срабатывает до того, как все обещания будут завершены - отправка ошибок в мою базу данных. Я не понимаю, почему.

Первоначально я пытался использовать обещание через некоторое время l oop, но это тоже не сработало. Схема кода здесь

Как лучше всего решить эту проблему?

  let refundsCopy = ticketsToRefund.map(e => e) 

   waitListToCharge.forEach((e,i) => {

    **code to calculate correct price and charges

        let ChargeCard = stripe.paymentIntents.create({
        ***code to execute charge on stripe api
    })

    Promise.allSettled([ChargeCard])
    .then(data => {

    //if successful
    if(data[0].status === 'fulfilled'){
    successfulPayments.push(data[0])
    refundsCopy.splice(0,e.quantity)

    }else {
    console.log('payment failed')
    failedPayments.push(data[0])
    }



    if(i===waitListToCharge.length-1){

    callOtherFunctions(successfulPayments, failedPayments, eventData, ticketsToRefund)
    }

    })

    })

Я пытался использовать asyn c, жду предложений других, но возникает та же проблема. Код, который я использовал, был:

    async function testPromise(){
  **code to calculate correct price and charges
  let ChargeCard = stripe.paymentIntents.create({

}
)
  let data = await Promise.allSettled([ChargeCard])


    if(data[0].status === 'fulfilled'){
     successfulPayments.push(data[0])
     refundsCopy.splice(0,e.quantity)

 }else {
    failedPayments.push(data[0])
 }


 if(i===waitListToCharge.length-1){
    callOtherFunctions(successfulPayments, failedPayments, eventData, ticketsToRefund)
 }

}

testPromise()


}) 

ОБНОВЛЕНИЕ: у меня это работает, в основном кодируя мой собственный forEach l oop. Код ниже. Был ли более простой способ?

    const myOwnForEachFunction = (e, i) => {

**code to calculate correct price and charges
let ChargeCard = stripe.paymentIntents.create({
  ***code for stripe
})

Promise.allSettled([ChargeCard])
.then(data => {

if(data[0].status === 'fulfilled'){
    console.log('payment success')
 successfulPayments.push(data[0])
 refundsCopy.splice(0,e.quantity)

}else {
console.log('payment failed')
failedPayments.push(data[0])
}



if(i===waitListToCharge.length-1){
callOtherFunctions(successfulPayments, failedPayments, eventData, ticketsToRefund)
}else{
myOwnForEachFunction(waitListToCharge[i+1], i+1)
}

})


}

myOwnForEachFunction(waitListToCharge[0], 0)
...