tutorial rxjava operator onnext java rx-java

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