Javascript 如果输入到每个承诺中的数据取决于前一个承诺的结果,我如何为一系列承诺编码?
请先阅读查询,然后再指导我回答之前关于Promise.all或async的问题 我正在尝试使用Stripe API和Promises对多张卡收费 如果收费成功,将向其他客户退款 费用的多少取决于退票的价格 一些收费将失败(客户信用卡上没有足够的钱等),所以我需要等待,看看收费(承诺)是否成功,然后再进行下一次收费(承诺) 我希望通过在.then()中使用splice(如果收费成功)和不使用splice(如果收费不成功)来确保使用正确的退款来计算费用 最后,我计划在使用代码完成所有费用后调用其他函数:Javascript 如果输入到每个承诺中的数据取决于前一个承诺的结果,我如何为一系列承诺编码?,javascript,foreach,stripe-payments,es6-promise,Javascript,Foreach,Stripe Payments,Es6 Promise,请先阅读查询,然后再指导我回答之前关于Promise.all或async的问题 我正在尝试使用Stripe API和Promises对多张卡收费 如果收费成功,将向其他客户退款 费用的多少取决于退票的价格 一些收费将失败(客户信用卡上没有足够的钱等),所以我需要等待,看看收费(承诺)是否成功,然后再进行下一次收费(承诺) 我希望通过在.then()中使用splice(如果收费成功)和不使用splice(如果收费不成功)来确保使用正确的退款来计算费用 最后,我计划在使用代码完成所有费用后调用其他函
i===waitListToCharge.length-1
作为一个条件
代码正在运行,但在前一个承诺完成之前,承诺似乎已经提前触发,并且在所有承诺完成之前,条件已经触发——将错误发布到我的数据库。我不明白为什么
我最初尝试在一个while循环中使用promise,但也没有成功。代码的概要在这里
解决这个问题的最佳方法是什么
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)
}
})
})
我在别人的建议下尝试使用async Wait,但同样的问题也发生了。我使用的代码是:
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循环来实现这一点。代码如下。有没有更简单的方法
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)
首先,您可以考虑在编写代码时使用一致的缩进-它将使阅读和调试变得更容易,不仅对于潜在的回答者,而且对您来说,当我们都可以看到“代码”> {<代码> >代码> } /代码>块及其嵌套级别时,一目了然,而不是必须仔细挑选每一行,只是为了挑选逻辑路径。您也可以考虑使用<代码> //<代码>作为注释(这是有效的语法,与<代码> *>代码>不同)您的第一个片断将导致<代码>引用错误<代码>,因为<代码>查格卡> /COD>不在您调用“代码>承诺”时的外部范围。如果我在forEach之前定义了ChargeCard,代码会起作用吗?为什么?Promise.allSettled工作正常-它没有等待.then()中的代码在进入下一个迭代之前执行
forEach
是同步的-它最多可以启动异步操作,但不会等待它们完成-并且它的返回值被丢弃。在更新的代码Promise.allSettled([ChargeCard])中。。。如果。。。否则…
是充值卡的反模式(过于复杂的代码)。然后。。。catch…
将forEach与承诺一起使用非常棘手,因为正如@traktor53所说的,即使使用async/await,也不会等待它们完成。我建议使用<>代码> ,但它与前文几乎相同,但是如果您使用异步/等待它等待每个迭代中完成的承诺。首先,您可以考虑在编写代码时使用一致的缩进-它将使阅读和调试变得更容易,不仅对于潜在的回答者,但对于您来说,当我们都可以一眼看到{
}
块及其嵌套级别时,您也可以这样做,而不必为了在逻辑路径上拾取而仔细地拾取每一行。您也可以考虑使用<代码> //<代码>作为注释(这是有效的语法,与<代码> *>代码>不同)您的第一个片断将导致<代码>引用错误<代码>,因为<代码>查格卡> /COD>不在您调用“代码>承诺”时的外部范围。如果我在forEach之前定义了ChargeCard,代码会起作用吗?为什么?Promise.allSettled工作正常-它没有等待.then()中的代码在进入下一个迭代之前执行forEach
是同步的-它最多可以启动异步操作,但不会等待它们完成-并且它的返回值被丢弃。在更新的代码Promise.allSettled([ChargeCard])中。。。如果。。。否则…
是充值卡的反模式(过于复杂的代码)。然后。。。catch…
将forEach与承诺一起使用非常棘手,因为正如@traktor53所说的,即使使用async/await,也不会等待它们完成。我建议使用for of代替,它与forEach几乎相同,但是如果使用async/wait,它将等待承诺在每次迭代中完成。