Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果输入到每个承诺中的数据取决于前一个承诺的结果,我如何为一系列承诺编码?_Javascript_Foreach_Stripe Payments_Es6 Promise - Fatal编程技术网

Javascript 如果输入到每个承诺中的数据取决于前一个承诺的结果,我如何为一系列承诺编码?

Javascript 如果输入到每个承诺中的数据取决于前一个承诺的结果,我如何为一系列承诺编码?,javascript,foreach,stripe-payments,es6-promise,Javascript,Foreach,Stripe Payments,Es6 Promise,请先阅读查询,然后再指导我回答之前关于Promise.all或async的问题 我正在尝试使用Stripe API和Promises对多张卡收费 如果收费成功,将向其他客户退款 费用的多少取决于退票的价格 一些收费将失败(客户信用卡上没有足够的钱等),所以我需要等待,看看收费(承诺)是否成功,然后再进行下一次收费(承诺) 我希望通过在.then()中使用splice(如果收费成功)和不使用splice(如果收费不成功)来确保使用正确的退款来计算费用 最后,我计划在使用代码完成所有费用后调用其他函

请先阅读查询,然后再指导我回答之前关于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,它将等待承诺在每次迭代中完成。