Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.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_Promise_Ecmascript 6_Bluebird - Fatal编程技术网

Javascript 蓝鸟:链。然后在一个循环中

Javascript 蓝鸟:链。然后在一个循环中,javascript,promise,ecmascript-6,bluebird,Javascript,Promise,Ecmascript 6,Bluebird,问题:如何将GetNextPaymentPayment有效负载/makePayment/confirmPayment链接成一个循环?您始终可以使用hasAnyPayments方法检查是否仍有任何付款 问题:您不能并行付款。要付款,您需要等待上一次付款完成 示例: SomeService //first payment .getNextPaymentPayload() .then(paymentPayload => this.makePayment(paymentPa

问题:如何将
GetNextPaymentPayment有效负载/makePayment/confirmPayment
链接成一个循环?您始终可以使用
hasAnyPayments
方法检查是否仍有任何付款

问题:您不能并行付款。要付款,您需要等待上一次付款完成

示例:

SomeService
    //first payment
    .getNextPaymentPayload()
    .then(paymentPayload => this.makePayment(paymentPayload))
    .then(paymentResponse => this.confirmPayment)
    //second payment        
    .then(SomeService.getNextPaymentPayload())
    .then(paymentPayload => this.makePayment(paymentPayload))
    .then(paymentResponse => this.confirmPayment)
    //so on...


假设
hasAnyPayments
将返回最终解析为布尔值的承诺:

let doPayments = () => {
    return hasAnyPayments().then((hasAny) => {
        if (!hasAny) {   
            return Promise.resolve();        // all done
        } else {
            return SomeService.getNextPaymentPayload()
                      .then(paymentPayLoad => this.makePayment(paymentPayLoad))
                      .then(paymentResponse => this.confirmPayment(paymentResponse))
                      .then(doPayments);     // "recurse"
        }
    }
}     

hasAnyPayments
返回什么?
。然后(GetNextPaymentPaymentPayload)
?@Alnitak
true
false
。如果
false
-您应该停止付款,如果
yes
-您应该至少进行一轮
getnextpaymentpaymentpayment/makePayment/confirmPayment
@elclars您是对的。已更正因此
hasAnyPayments
是同步的,或者返回一个返回布尔值的承诺?似乎是最简单的方法answer@bonebrigade最近,我自己也一直在使用这样的代码。在我自己的代码中,我希望每次递归之间有1秒的延迟,因此我使用:
返回新承诺((resolve)=>setTimeout(resolve,1000)
而不是直接的
承诺.resolve()
。你可以在Bluebird中使用。@sdgluck我实际上没有使用Bluebird-上面的答案只是使用标准承诺,没有任何扩展。你不需要
返回承诺。resolve()
。你可以在那里执行
返回;
。不需要创建额外的承诺。