Каков вариант использования doOnSuccess и onSuccess в rxJava - PullRequest
1 голос
/ 15 марта 2019

Я путаю насчет варианта использования 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)}
          )

Как обычно, я думаю, что дело в порядке с 21012 * здесь?

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

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Одиночные и 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));
0 голосов
/ 15 марта 2019

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

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

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

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

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

...