我们什么时候应该使用 Observable 的 doOnNext( ) 而不是 onNext()?
原文由 Aravind Yarram 发布,翻译遵循 CC BY-SA 4.0 许可协议
我们什么时候应该使用 Observable 的 doOnNext( ) 而不是 onNext()?
原文由 Aravind Yarram 发布,翻译遵循 CC BY-SA 4.0 许可协议
_重要编辑_:-紧接在下方的粗体字符中-
*一旦掌握了这个概念,我热烈建议您看看这个 链接,它是一个生命的改变者,不仅因为我们使用不同的 observable 作为 Observable
, Single
, Maybe
that could be need a different tool as doOnEvent()
for Single
and doOnEach()
for Observable
but because if you want to debug ,有一些原因导致 doOnNext() 通常甚至不是理想的选择,因为我们可以忽略与解决问题相关的其他事件*
原始回复:-部分修改-
首先 doOnNext()
可以在 Observable 和 Subscribe 之间的运算符链中调用 更多次,这为您调试代码提供了更大的可能性。由于其“流”性质,在 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()
但 也 可以使用—d231307de5022fb0dd7db92677e doOnNext()
,因为它可以使您的代码更具可读性,因为您可以放置一个简单的 onNext()
理想情况下,它的结构可以遵循其他说明。 (这是有争议的,因为所有的建筑思想)
等同于 doOnNext()
并且出于相同的调试目的,您可以使用其他不言自明的运算符:
doOnSubscribe()、doOnUnsubscribe()、doOnCompleted()、doOnError()、doOnTerminate()、finallyDo()、doOnEach()、doOnRequest()
doOnNext()
允许您查看 Observable(通常很长)链中发生了什么,真正重要的是 您可以窥探链中发生的事情,而不影响任何操作,无需任何转换(让我们说不正确的一种 Log.d
我们在命令式而非反应式代码中使用)。 这就是为什么被称为 副作用 的原因。
编辑(由于评论中的问题):
doOnNext()
和上面的方法只是回调,请参考 , doOnNext()
官方文档说的
只是修改一个 Observable,以便它在调用 onNext 时调用一个动作。
真的很简单,这就是为什么有时调用来上传进度条,但也真正用于存储库模式,例如,如果你想在调用 retrofit 之后将数据存储到 db/ 或缓存中。
如果您真的对引擎盖下的 doSomethingReactive 方法感到好奇,只需在“真实”方法 SomethingReactive 中调用方法 call()
(来自接口操作的回调)
原文由 trocchietto 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
1 回答2.1k 阅读✓ 已解决
doOnNext
用于副作用:您想在流的中间步骤中对项目排放做出反应(例如记录),例如在流被过滤之前,对于像记录这样的横向行为,但您仍然希望值向下传播。onNext
更最终,它消耗了价值。