【问题标题】:What is the use case for doOnSuccess vs onSuccess in rxJavarxJava 中 doOnSuccess 与 onSuccess 的用例是什么
【发布时间】:2019-08-06 01:49:54
【问题描述】:

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

案例一:

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() 运算符的用例?

【问题讨论】:

  • doOnSuccess 是一次性回调方法,而 onSuccess 是来自 subscribeBy 的 doOnSuccess 的 Lamda 表达式。

标签: android retrofit rx-java rx-kotlin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我通常申请doOnSuccess() 的一个用例是在调用成功时强制执行一些触发器。例如,我有一个函数可以在一个公共类中获取用户数据

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

    如您所见,目前还没有订阅。想要使用上述功能的人可以稍后调用。

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

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

    【讨论】:

    • 有什么情况可以一起使用这些方法吗?哪个会先被调用?
    • 我还没有发现它们之间的任何区别,这有点取决于你一起使用时的喜好
    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多