Чтобы начать получать испускаемые значения из наблюдаемой (например, Single<T>
), вы должны subscribe()
к ней сначала.
Вы, вероятно, подписываетесь только на Single
, возвращаемый pay
дважды где-то еще, и поэтому вы видите first
напечатанным два раза. В коде, который вы показываете, я вижу, что вы не подписаны ни на одно из наблюдаемых там, так что потом ничего не произойдет.
Если вы хотите связать наблюдаемые, наиболее распространенным вариантом будет использование оператора flatMap
(есть и другие варианты).
В вашем случае это будет выглядеть примерно так:
public Single<PayResponse> pay(PayRequest apiRequest) {
return client.initiatePayment(apiRequest)
.flatMap(initiatePaymentResponse -> {
System.out.println("first");
return client.confirmPayment(initiatePaymentResponse.getPaymentId();
})
.flatMap(confirmPaymentResponse -> {
System.out.println("second");
return doConfirmationLogic(confirmPaymentResponse);
})
.doOnSuccess(confirmationLogicResponse -> System.out.println("third"))
.doOnError(ex -> {
ex.printStackTrace();
logError(ex);
});
}
Затем вы подписываетесь на сингл, возвращаемый pay
где-то еще так:
...
pay(apiRequest)
.subscribe(onSuccesValue -> {
// The whole chain was successful and this is the value returned
// by the last observable in the chain (doConfirmationLogic in your case)
}, onError {
// There was an error at some point during the chain
}
...
Я предполагаю, что все методы initiatePayment
, confirmPayment
, doConfirmationLogic
возвращают Singles
и что doConfirmationLogic
в конечном итоге возвращает Single<PayResponse>
. Если это не так, вам нужно будет внести небольшие изменения, но вы получите общее представление о том, как работают цепочки наблюдаемых.