Каков вариант использования doOnSuccess против onSuccess в rxJava

Я не понимаю, как использовать doOnSuccess в rxJava.
Давайте посмотрим на код:

Дело 1:

networkApi.callSomething()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())               
    .doOnSuccess(__ -> showLog(SUCCESS))
    .doOnError(__ -> showLog(ERROR))
    .subscribeBy(
             onSuccess = {//Do something}, 
             onError = {//Show log here}
          )

Случай 2:

networkApi.callSomething()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())               
    .subscribeBy(
             onSuccess = {
               //Do something
               showLog(SUCCESS)
             }, 
             onError = {showLog(ERROR)}
          )

Как обычно, я думаю, что вариант 2 подойдет.
Я также сослался на некоторый исходный код в github и видел, как некоторым людям нравится случай 1.
Я пытаюсь спросить себя, каков здесь вариант использования doOnSuccess?

Есть ли какой-либо вариант использования, который нам нужен, чтобы применить оператор doOnSuccess()?


person Bulma    schedule 15.03.2019    source источник
comment
doOnSuccess - это метод одноразового обратного вызова, с другой стороны, onSuccess - это Lamda-выражение doOnSuccess из subscribeBy.   -  person Aslam Hossin    schedule 15.03.2019


Ответы (2)


У Singles и Maybes есть сигнал успеха, и у обработчика вызывается метод onSuccess. Тем не менее, часто возникает необходимость в побочном эффекте сигнала успеха в различных точках потока, поэтому используется оператор doOnSuccess.

getUserAsSingle()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess(user -> ui.showUser(user))
.flatMap(user -> 
     getUserFavoritesAsSingle(user)
     .subscribeOn(Schedulers.io())
)
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess(userFavs -> ui.showUserFavorites(userFavs))
.flatMap(userFavs -> 
     updateLoginCounter(userFavs.userId)
     .subscribeOn(Schedulers.io())
)
.observeOn(AndroidSchedulers.mainThread())
subscribe(newCounter -> ui.showLoginCount(newCounter),
    error -> ui.showError(error));
person akarnokd    schedule 15.03.2019

Один из вариантов использования, который я обычно применяю для doOnSuccess(), - это принудительное применение некоторых триггеров при успешном вызове. Например, у меня есть функция для получения пользовательских данных в общем классе.

fun getUserData(userId: Int) {
    userDataApi(userId)              
        .doOnSuccess { fetchAllImages() }
        .doOnError { Log.e(it) }
}

Как видите, подписки пока нет. И тот, кто захочет использовать указанную выше функцию, может вызвать ее позже.

getUserData
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe()

И если getUserData успешно, он всегда будет вызывать fetchAllImages().

person Bach Vu    schedule 15.03.2019
comment
Можно ли использовать эти методы вместе? И какой будет называться первым? - person Bulma; 15.03.2019
comment
Я еще не нашел никакой разницы между двумя из них, это зависит от ваших предпочтений, когда вы используете их вместе. - person Bach Vu; 15.03.2019