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

What is the purpose of doOnNext(...) in RxJava

我们什么时候应该使用 Observable 中的 doOnNext() 而不是 onNext()?

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

onNext更最终,它消耗了价值。

重要编辑:-紧接在下方的粗体字符-

* 一旦掌握了这个概念, 我热烈建议你看看这个 link,它是一个生命的改变者,不仅因为我们使用不同的可观察性,如 ObservableSingleMaybe 可能需要一个SingledoOnEvent()ObservabledoOnEach() 不同的工具,但是因为如果你想调试,有一些原因导致 doOnNext() 通常甚至不是理想的选择,因为我们可以忽略与解决问题相关的其他事件*

原始回复:-部分修改-

首先,在 Observable 和 Subscribe 之间的运算符链中,doOnNext() 可以被调用 更多次,这为您调试代码提供了更大的可能性。由于其 "stream" 的性质,在 RXJava 中调试并不容易, doOnNext() 反而使调试更容易。为此,您还可以考虑将它与 doOnError() 运算符结合使用。为什么不使用简单的 onNext()?因为调试与代码逻辑没有严格关系,理论上你也可以去掉生产前的doOnNext()

需要理解的一个真正重要的事情是,给定一个 Observable 来订阅长链,您可以在特定点使用 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(), doOnUnsubscribe(), doOnCompleted(), doOnError(), doOnTerminate(),finallyDo(), doOnEach(), doOnRequest()

doOnNext() 允许您查看 Observable(通常很长)链中发生了什么,真正重要的是 您可以窥探链中发生的事情,不影响任何操作,不进行任何转换(假设我们在命令式而不是反应式代码中使用的 Log.d 不正确)。 这就是为什么被称为 [=66 的原因=]效果.

编辑(由于评论中的问题):

doOnNext()和上面的方法只是回调,请参考thatdoOnNext()官方文档说

just modifies an Observable so that it invokes an action when it calls onNext.

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

如果您真的对引擎盖下的 doSomethingReactive 方法感到好奇,只需在 "real" 方法 SomethingReactive

中调用方法 call()(来自接口操作的回调)