Пожалуйста, прочитайте запрос, прежде чем направить меня к предыдущему ответу о 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)