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

标签 java rx-java reactive-programming

我有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

最佳答案

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);
                });

关于java - 如何将异常从内部 doOnError 传播到外部 doOnError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55631087/

相关文章:

java - RxJava缝制两个查询

haskell - Reactor-banana-wx `sink` 不会生成启用后接收器处理的事件

java - Java 线程在没有 GC 干扰且机器负载较低的情况下会出现大量睡过头的情况

java - Java 9 中 vector/流数据的异步、可组合返回值

java - 如何在准备就绪时使用响应式(Reactive) Flux/Mono 将消息推送到上游,而不是间隔轮询状态?

reactive-programming - RxJava 按任意值进行反跳

ios - 如何从 Swift View 模型绑定(bind)到 Obj-c View Controller ?

java - Java中声明静态常量会影响编译后的类

java - 具有动态 localName 值的 JacksonXmlRootElement

java - 根据键中某些字符串的一部分从 HashMap 中检索键?