web-dev-qa-db-fra.com

Quel est le but de doOnNext (...) dans RxJava

Quand devrions-nous utiliser doOnNext () dans Observable au lieu de simplement onNext ()?

51
Aravind R. Yarram

doOnNext concerne les effets secondaires: vous souhaitez réagir (par exemple, un journal) aux émissions d'éléments lors d'une étape intermédiaire de votre flux, par exemple avant que le flux ne soit filtré, pour un comportement transversal tel que la journalisation, mais vous souhaitez tout de même la valeur à propager dans le flux.

onNext est plus final, il consomme la valeur.

75
Simon Baslé

IMPORTANT EDIT: -en caractères gras immédiatement en dessous-

* Une fois que le concept est saisi, je vous suggère vivement de jeter un coup d'œil à ceci lien , est un mécanisme de changement de vie, non seulement parce que nous utilisons différentes observables comme Observable, Single, Maybe qui pourrait nécessiter un outil différent de doOnEvent() pour Single et doOnEach() pour Observable mais parce que si vous voulez déboguer, il y a des raisons pour lesquelles doOnNext () peut souvent même ne pas être le choix idéal, car nous pourrions ignorer d'autres événements pertinents pour résoudre le problème *

RÉPONSE ORIGINALE: - partiellement modifiée -

Tout d'abord, doOnNext() peut être appelé encore plus de fois dans la chaîne d'opérateurs entre Observable et Subscribe, cela vous donne de plus grandes possibilités déboguer votre code. En raison de sa nature "stream", le débogage dans RXJava n’est pas facile, doOnNext() facilite le débogage. À cette fin, vous pouvez également le combiner avec l'opérateurdoOnError(). Pourquoi ne pas utiliser un simple onNext()? Étant donné que le débogage n’est pas strictement lié à la logique du code, en théorie, vous pouvez également éliminer la doOnNext() avant de commencer la production.

Il est essentiel de comprendre que lorsqu'un abonné Observable peut s'abonner à une longue chaîne, vous pouvez utiliser doOnNext dans un point particulier pour voir ce qu'un opérateur redonne à un autre:

Par exemple :

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 cas d'utilisation typique pour utiliser doOnNext() pourrait par exemple se produire lorsque vous souhaitez mettre en cache une réponse d'un serveur. Vous pouvez par exemple utiliser map() mais aussidoOnNext(), car il vous permet de rendre votre code plus lisible, au lieu de mettre une simple onNext() qui, idéalement, aurait pu être structurée pour suivre d'autres instructions. (Ceci est discutable, comme toutes les pensées architecturales)

De même pour doOnNext() et pour les mêmes objectifs de débogage, vous pouvez utiliser d'autres opérateurs qui se passent d'explication:

doOnSubscribe (), doOnUnsubscribe (), doOnCompleted (), doOnError (), doOnTerminate (), finallyDo (), doOnEach (), doOnRequest ()

doOnNext() vous permet de voir ce qui se passe dans les chaînes Observable (souvent très longues), ce qui est vraiment important, c'est que vous pouvez un peu espionner ce qui se passe dans le chaîne, sans affecter aucune opération, sans effectuer de transformation (disons pas correctement une sorte de Log.d que nous utilisons en code impératif, pas réactif). C’est la raison pour laquelle est appelé un effet side.

EDIT (à cause de la question dans les commentaires):

doOnNext() et la méthode ci-dessus ne sont que des rappels, veuillez vous référer à that , doOnNext() comme le dit la documentation officielle

modifie simplement un observable afin qu'il appelle une action quand il appelle onNext.

Vraiment simple, c’est pourquoi on l’appelle parfois pour télécharger la barre de progression, mais elle est également réellement utilisée dans le modèle de référentiel, par exemple si vous souhaitez stocker des données sur la base de données ou la mise en cache après un appel à la modification, par exemple.

Si vous êtes vraiment curieux sous le capot, les méthodes doSomethingReactive appellent simplement la méthode call() (un rappel de l'action d'interface) à l'intérieur de la "vraie" méthode SomethingReactive.

18
trocchietto