rxJava 中 doOnSuccess 与 onSuccess 的用例是什么

What is the use case for doOnSuccess vs onSuccess in rxJava

我对 rxJava 中 doOnSuccess 的用例感到困惑。
让我们看看代码:

案例 1:

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

案例二:

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

和往常一样,我认为情况 2 没问题。
我也在 github 中引用了一些源代码,我看到有些人喜欢案例 1。
我试着问自己 doOnSuccess 这里的用例是什么?

有没有我们需要应用 doOnSuccess() 运算符的用例?

我通常申请的一个用例doOnSuccess()是在调用成功时强制执行一些触发器。例如,我有一个函数可以在 class

中获取用户数据
fun getUserData(userId: Int) {
    userDataApi(userId)              
        .doOnSuccess { fetchAllImages() }
        .doOnError { Log.e(it) }
}

如您所见,还没有订阅。想使用上述功能的朋友可以稍后再调用。

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

如果getUserData成功,它会一直调用fetchAllImages()

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