在 RxJava 中 doOnNext (...)的目的是什么

什么时候我们应该使用来自 Observer 的 DoOnNext ()而不仅仅是 onNext () ?

55901 次浏览

doOnNext是用于副作用的: 您希望对流的中间步骤中的项目排放做出反应(例如 log) ,例如在流被过滤之前,对于横向行为(例如日志记录) ,但是您仍然希望该值沿流传播。

onNext更终极,它消耗值。

重要编辑 :-下面用粗体字表示-

一旦理解了这个概念 * , 我强烈建议你看看这个 链接,是一个生命改变者,不仅因为我们使用不同的观察 ObservableSingleMaybe,可能需要一个不同的工具 doOnEvent()SingledoOnEach()Observable,还因为如果你想调试,有一些原因为什么 doOnNext ()往往不是理想的选择,因为我们可以忽略其他事件,有关解决问题 *

原答复:-部分修改-

首先,在可观察和订阅之间的操作符链中,可以将 doOnNext()称为 甚至更多次,这给了您调试代码的更大可能性。由于其“流”的性质,在 RXJava 中做调试并不容易,doOnNext()反而使得调试更加容易。在这种情况下,您也可以考虑将它与 doOnError()操作符结合起来。为什么不用一个简单的 onNext()呢?因为调试与代码的逻辑并不严格相关,所以在理论上也可以在生产之前消除 doOnNext()

需要理解的一个非常重要的事情是,给定一个可观察的订阅长链,您可以在特定点上使用 doOnNext,查看操作符返回给另一个操作符的内容:

例如:

Observable.just("Donald", "Duck", "Mickey", "Goofy",
"Uncle")
.doOnNext{System.out.println("Here ou will get the strings above:$it ")}
.map{it.length}
.subscribe { println("Here you will get the numbers of how every string is long: $it") }}

例如,当你想缓存来自服务器的响应时,一个典型的使用 doOnNext()的用例可能会发生,例如,你可以使用 map()而不是 还有 doOnNext(),因为它允许你使你的代码更容易阅读,相反,你可以放一个简单的 onNext(),理想情况下它可以按照其他指令结构化。(正如所有的建筑学思想一样,这是有争议的)

等于 doOnNext(),并且用于相同的调试目的 你可以使用其他不言自明的操作符:

DoOnSubscribe () ,doOnUnscribe () ,doOnCompleted () ,doOnError () , DoOnTerminal () ,finally Do () ,doOneach () ,doOnRequest ()

doOnNext()可以让你看到可观察到的(通常是非常长的)链中发生了什么,真正重要的是 您可以监视链中正在发生的事情,而不影响任何操作,也不进行任何转换(比方说不是我们在命令式代码中使用的一种 Log.d,而不是反应式代码)。,这就是为什么称为 < em > side 效应的原因。

编辑(因为评论中的问题) :

doOnNext()和上面的方法只是回调函数,正如官方文件所说,请参考 那个doOnNext()

只是修改了一个 Observer,以便它在调用时调用一个操作 下集预告。

真的很简单,这就是为什么有时调用上传进度条,但也真正用于存储库模式,例如,如果您想存储数据到 db/或缓存后,调用改造例如。

如果你真的很好奇,doSomething Reactive 方法只是调用“ real”方法 Something thingReactive 内部的方法 call()(来自 Interface Action 的回调)

doOnNext()允许我们添加一些额外的操作,这些操作在每次获得新数据项时都会发生。

DoOnError 不处理错误,因为它不消耗错误。他只是用它做点什么,比如录音。(doOnNext 也是如此——它也不使用元素,并且元素最终仍然在 onNext 订阅服务器中)。


Observable.just("Some data...")
.doOnNext(System.out::println)
.doOnNext(value -> System.out.println("before transform: " + value+" You can add something here but it dont affect in data"))
.map(value -> value + "| adding some new data")
.doOnNext(value -> System.out.println("after transform: " + value))
.subscribe(onNext -> {
System.out.println("onNext: "+onNext); // print out the remaining numbers
});

结果:

一些数据。

在转换之前: 一些数据... 你可以在这里添加一些东西,但它不 对数据的影响

转换后: 一些数据... | 添加一些新数据

一些数据... | 添加一些新数据