Как распространить исключение из внутреннего doOnError во внешний doOnError? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть 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?

1 Ответ

1 голос
/ 11 апреля 2019

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