operator - ¿Cuál es el propósito de doOnNext(...) en RxJava
rxjava operators android (2)
¿Cuándo deberíamos usar doOnNext() de Observable en lugar de solo onNext ()?
doOnNext
es para efectos secundarios: desea reaccionar (por ejemplo, iniciar sesión) a las emisiones de elementos en un paso intermedio de su flujo, por ejemplo, antes de que se filtre el flujo, para un comportamiento transversal como el registro, pero aún desea que el valor se propague hacia abajo la corriente.
onNext
es más final, consume el valor.
EDICIÓN IMPORTANTE : -en caracteres en negrita inmediatamente debajo-
* Una vez que uno comprende el concepto, le sugiero que eche un vistazo a este
link
, es un cambio de vida, no solo porque usamos diferentes observables como
Observable
,
Single
,
Maybe
eso podría necesitar una herramienta diferente como
doOnEvent()
para
Single
y
doOnEach()
para
Observable
pero debido a que si desea depurar, hay algunas razones por las cuales doOnNext () a menudo podría no ser la opción ideal, ya que podríamos ignorar otros eventos que son relevantes para resolver el problema *
RESPUESTA ORIGINAL: parcialmente modificada
En primer lugar,
doOnNext()
se puede llamar
aún más veces
en la cadena de operadores entre Observable y Subscribe, esto le brinda mayores posibilidades para depurar su código.
Debido a su naturaleza de "transmisión", no es fácil depurar en RXJava,
doOnNext()
facilita la depuración.
Para este propósito, puede considerar también combinarlo con el operador
doOnError()
.
¿Por qué no usar un simple
onNext()
?
Debido a que la depuración no está estrictamente relacionada con la lógica del código, en teoría también podría eliminar el
doOnNext()
antes de entrar en producción.
Una cosa realmente esencial para entender es que, dado un Observable para suscribirse a una cadena larga, puede usar doOnNext en un punto particular, para ver lo que un operador está devolviendo a otro:
Por ejemplo :
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") }}
Un caso de uso típico para emplear
doOnNext()
podría ocurrir, por ejemplo, cuando desea almacenar en caché una respuesta de un servidor, por ejemplo, podría usar
map()
pero
also
doOnNext()
, porque le permite hacer que su código sea más legible como en su lugar, pondrías un simple
onNext()
que idealmente podría haberse estructurado para seguir otras instrucciones.
(Esto es discutible, como todos los pensamientos arquitectónicos)
Igualmente para
doOnNext()
y para los mismos propósitos de depuración, podría usar otros operadores que se explican por sí mismos:
doOnSubscribe (), doOnUnsubscribe (), doOnCompleted (), doOnError (), doOnTerminate (), finallyDo (), doOnEach (), doOnRequest ()
doOnNext()
permite ver lo que sucede en las cadenas Observable (a menudo muy largas), lo que es realmente importante es que
puede espiar lo que sucede a través de la cadena, sin afectar ninguna operación, sin realizar ninguna transformación (vamos a digamos que no es un tipo de
Log.d
que usamos en código imperativo, no reactivo).
Esta es la razón por la cual se llama un efecto
secundario
.
EDITAR (debido a la pregunta en los comentarios):
doOnNext()
y el método anterior son solo devoluciones de llamada, consulte
that
,
doOnNext()
como dice la documentación oficial
simplemente modifica un Observable para que invoque una acción cuando invoca onNext.
Realmente simple, esta es la razón por la que a veces se llama para cargar la barra de progreso, pero también se usa realmente en el patrón de repositorio, por ejemplo, si desea almacenar datos en la base de datos / almacenamiento en caché después de una llamada para actualizar, por ejemplo.
Si realmente tiene curiosidad, los métodos doSomethingReactive simplemente llaman al método
call()
(una devolución de llamada de la Acción de interfaz) dentro del método "real" SomethingReactive