RxJava中doOnNext(…)的用途是什么

RxJava中doOnNext(…)的用途是什么,java,rx-java,Java,Rx Java,我们什么时候应该使用from Observable而不是onNext()?doOnNext用于副作用:您希望在流的中间步骤(例如在过滤流之前)对项目排放做出反应(例如记录),以进行横向行为(例如记录),但您仍然希望该值沿流传播 onNext更为最终,它会消耗值。重要编辑:-下面用粗体字符- *一旦掌握了这个概念, 我强烈建议你看看这个,它是一个生命的改变者,不仅因为我们使用不同的可观察对象,如可观察对象,单个,可能,对于单个和doOnEach()用于可观察的,但因为如果您想调试,doOnNext

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

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

onNext
更为最终,它会消耗值。

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

*一旦掌握了这个概念, 我强烈建议你看看这个,它是一个生命的改变者,不仅因为我们使用不同的可观察对象,如
可观察对象
单个
可能
,对于
单个
doOnEach()
用于
可观察的
,但因为如果您想调试,doOnNext()往往不是理想的选择,有一些原因,因为我们可以忽略与解决问题相关的其他事件*

原始答复:-部分修改-

首先,在Observable和Subscribe之间的运算符链中,可以多次调用
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(),doOnSubscribe(),doOnCompleted(),doOnError(), dointerminate(),finallyDo(),doOnEach(),doOnRequest()

doOnNext()
允许您查看可观察(通常很长)链中发生的情况,真正重要的是您可以在不影响任何操作、不进行任何转换的情况下对链中发生的情况进行监视(比如说,我们在命令式代码中使用的不是反应式代码,而是一种
Log.d
这就是为什么称为副作用的原因

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

doOnNext()
而上面的方法只是回调,请参考官方文档中的
doOnNext()

只是修改一个可观察对象,以便它在调用时调用一个动作 onNext

非常简单,这就是为什么有时调用它来上载进度条,但实际上也在存储库模式中使用,例如,如果您希望在调用翻新后将数据存储到db/或缓存中


如果你真的很好奇doSomethingReactive方法只需调用“real”方法中的方法
call()
(来自接口操作的回调)SomethingReactive

我注意到你正在使用[system.reactive]对于非Rx.NET问题…请记住,这是针对.NET Rx问题的。专门针对RxJava的问题不应该使用它。我注意到,
Rx
system.reactive
的同义词-试图在meta上解决这个问题,因此它是一个单独的更通用的标记。我想知道为什么我不能放置“日志”直接在Observable中的语句…即在订阅服务器/观察服务器上调用onNext(…)的类您肯定可以。只是该值可能已被后续转换丢失(例如,将所有值记录在doOnNext中,然后过滤一些值,并仅对过滤后的值应用onNext)你把
onNext
称为什么?@IgorGanapolsky
onNext
Observer
(或
Subscriber
)界面的一部分,你可以通过
subscribe(…)在流的末尾插入该界面
使用中的最终值的方法stream@SimonBaslé它运行在哪个计划程序上?是否正确:onNext仅在所有doOnNext完成其任务后执行?例如,如果我在doOnNext中修改值,onNext将收到此修改值?不,我认为不正确。我添加了editcomment以使您更容易理解doOnWhatever reactive,请参考上面的内容。在调用每个onNext之前执行doOnNext!从一个带有日志的示例中可以很容易地看出,现在您可以自己动手了,这是一个很好的答案。很好,我可以在订阅之前多次调用doOnNext(consumer),它将执行accept()关于所有的消费者?@luis_cortes非常感谢你的干预,我小时候写过这篇文章,现在我删除了进度条的内容,并添加了一些关于doOnNext调试限制的新的imo重要内容(希望不要超出OP问题的范围),一旦编码员开始编写更复杂的链,请仔细检查您是否愿意