RxJava 中 doOnNext(...) 的目的是什么
What is the purpose of doOnNext(...) in RxJava
我们什么时候应该使用 Observable 中的 doOnNext() 而不是 onNext()?
doOnNext
用于副作用:您想在流的中间步骤中对项目排放做出反应(例如记录),例如在流被过滤之前,对于像记录这样的横向行为,但您仍然希望值沿流传播。
onNext
更最终,它消耗了价值。
重要编辑:-紧接在下方的粗体字符-
* 一旦掌握了这个概念,
我热烈建议你看看这个 link,它是一个生命的改变者,不仅因为我们使用不同的可观察性,如 Observable
、Single
、Maybe
可能需要一个Single
的 doOnEvent()
和 Observable
的 doOnEach()
不同的工具,但是因为如果你想调试,有一些原因导致 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()
和上面的方法只是回调,请参考that,doOnNext()
官方文档说
just modifies an Observable so that it invokes an action when it calls
onNext.
真的很简单,这就是为什么有时调用上传进度条的原因,但也真正用于存储库模式,例如如果你想在调用后将数据存储到 db/or 缓存例如改造。
如果您真的对引擎盖下的 doSomethingReactive 方法感到好奇,只需在 "real" 方法 SomethingReactive
中调用方法 call()
(来自接口操作的回调)
我们什么时候应该使用 Observable 中的 doOnNext() 而不是 onNext()?
doOnNext
用于副作用:您想在流的中间步骤中对项目排放做出反应(例如记录),例如在流被过滤之前,对于像记录这样的横向行为,但您仍然希望值沿流传播。
onNext
更最终,它消耗了价值。
重要编辑:-紧接在下方的粗体字符-
* 一旦掌握了这个概念,
我热烈建议你看看这个 link,它是一个生命的改变者,不仅因为我们使用不同的可观察性,如 Observable
、Single
、Maybe
可能需要一个Single
的 doOnEvent()
和 Observable
的 doOnEach()
不同的工具,但是因为如果你想调试,有一些原因导致 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()
和上面的方法只是回调,请参考that,doOnNext()
官方文档说
just modifies an Observable so that it invokes an action when it calls onNext.
真的很简单,这就是为什么有时调用上传进度条的原因,但也真正用于存储库模式,例如如果你想在调用后将数据存储到 db/or 缓存例如改造。
如果您真的对引擎盖下的 doSomethingReactive 方法感到好奇,只需在 "real" 方法 SomethingReactive
中调用方法call()
(来自接口操作的回调)