如何将异常从内部doOnError传播到外部doOnError?

问题描述 投票:0回答:1

我有pay方法,我应该调用initiatePayment和onSuccess我应该调用confirmPayment。如果两个调用中的任何一个都有异常,它应该发出异常

public Single<PayResponse> pay(PayRequest apiRequest) {

            return client.initiatePayment(apiRequest)
                    .doOnSuccess(initiatePaymentResponse -> {
                        client.confirmPayment(initiatePaymentResponse.getPaymentId())
                                .doOnSuccess(confirmPaymentResponse -> doConfirmationLogic(confirmPaymentResponse ))
                                .doOnError(ex -> {ex.printStackTrace();logError(ex);});
                    })

                    .doOnError(ex -> {ex.printStackTrace();logError(ex);});
        }

在我引用的代码中,confirmPayment发生错误,但initiatePayment正常继续。

如何将异常从内部doOnError传播到外部doOnError

java rx-java reactive-programming
1个回答
1
投票

doOnXxx()方法仅用于回调目的,它们不涉及流式传输管道,这就是它们被称为“副作用方法”的原因。所以没有办法将错误从doOnXxx()传播到上游。

错误始终是Rx世界中的终端事件,每当发生错误时管道都会被取消,因此不需要在doOnSuccess()方法中执行某些操作以确保到目前为止一切都“正常”。因此,您可以简单地以这种方式编写代码,而不是将代码嵌套到doOnSuccess()链中:

/*
        you can deal with errors using these operators:

        onErrorComplete
        onErrorResumeNext
        onErrorReturn
        onErrorReturnItem
        onExceptionResumeNext
        retry
        retryUntil
        retryWhen
         */
        return client.initiatePayment(apiRequest)
                //if in initiatePayment was error this will send cancel upstream and error downstream
                .map(initiatePaymentResponse -> { client.confirmPayment(initiatePaymentResponse.getPaymentId());})
                //if in confirmPayment was error this never happens
                .map(confirmPaymentResponse -> doConfirmationLogic(confirmPaymentResponse))
                //every error in this pipeline will trigger this one here
                .doOnError(ex -> {
                    ex.printStackTrace();
                    logError(ex);
                });
© www.soinside.com 2019 - 2024. All rights reserved.