我们何时应该使用Observable中的doOnNext()而不是onNext()?
答案 0 :(得分:68)
doOnNext
用于副作用:您希望在流的中间步骤中对项目排放做出反应(例如,日志),例如在流过滤之前,针对横向行为(如日志记录),但是您仍然希望值在流中传播。
onNext
更为终结,它消耗了价值。
答案 1 :(得分:14)
首先,在Observable和Subscribe之间的运算符链中,doOnNext()
可以被称为甚至更多次,这为您提供了调试代码的更多可能性。由于其“流”性质,在RXJava中进行调试并不容易,doOnNext()
反而使调试更容易。为此,您还可以考虑将其与doOnError()
运算符组合使用。为什么不使用简单的onNext()
?因为调试与代码的逻辑没有严格的关系,理论上你也可以在生产之前消除doOnNext()
。
当您想要缓存来自服务器的响应时,会发生另一种使用它的可能性,例如,您可以使用map()
但also doOnNext()
,因为它允许您让你的代码更具可读性,相反,你会设置一个简单的onNext()
,理想情况下可以按照其他说明进行结构化。 (这是有争议的,因为所有的建筑思想)
我发现在RXJava2中使用此运算符的一个典型示例是显示进度条,特别是当您在不使用所有三种已知方法(onNext,onError,onComplete)的情况下订阅Observer
时就是这种情况来自此博客小节的此片段中显示的RXJava2中Consumer的订阅:Show Progress Bar with doOnNext(< -please如果您点击此链接,因为这是一个很长的教程直接转到半页到看看如何使用'doOnNext'无论如何都遵循一个简单的小片段:
@Override
protected void onStart() {
super.onStart();
Observable<String> searchTextObservable = createButtonClickObservable();
searchTextObservable
.observeOn(AndroidSchedulers.mainThread())
//HERE IT IS
.doOnNext(new Consumer<String>() {
@Override
public void accept(String s) {
showProgressBar();
}
})
.observeOn(Schedulers.io())
.map(new Function<String, List<String>>() {
@Override
public List<String> apply(String query) {
return mCheeseSearchEngine.search(query);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<String>>() {
@Override
public void accept(List<String> result) {
hideProgressBar();
showResult(result);
}
});
等同于doOnNext()
并且用于相同的调试目的
你可以使用其他不言自明的算子:
编辑(由于评论中的问题):doOnSubscribe(),doOnUnsubscribe(),doOnCompleted(),doOnError(), doOnTerminate(),finallyDo(),doOnEach(),doOnRequest()
doOnNext()
以及上述方法只是回调,请参阅that,doOnNext()
,正如官方文档所述
只需修改一个Observable,以便在调用时调用一个动作 onNext。
非常简单,这就是为什么有时会调用上传进度条的原因,但实际上也是在存储库模式中使用,例如,如果要在调用改进后将数据存储到db /或缓存中。
如果你真的很好奇,那么doSomethingReactive方法只需在“真实”方法中调用方法call()
(来自界面操作的回调)SomethingReactive