RxJava: le chaînage des observables
Est-il possible de mettre en place quelque chose comme la prochaine chaîne via RxJava:
loginObservable()
.then( (someData) -> {
//returns another Observable<T> with some long operation
return fetchUserDataObservable(someData);
}).then( (userData) -> {
//it should be called when fetching user data completed (with userData of type T)
cacheUserData(userData);
}).then( (userData) -> {
//it should be called after all previous operations completed
displayUserData()
}).doOnError( (error) -> {
//do something
})
J'ai trouvé cette bibliothèque très intéressante, mais ne peuvent pas comprendre notre façon de la chaîne demande, où les uns des autres dépend de la précédente.
Vous devez vous connecter pour publier un commentaire.
Sûr, RxJava prend en charge
.map
qui le fait. À partir de la RxJava Wiki:Fondamentalement, ce serait:
switchMap
peut-être ce que vous voulez.switchMap
est en effet ce qu'il vous faut si vous êtes à la consommation d'un observable.then
.switchMap
?C'est le poste le plus élevé lors de Googler RxJava de la chaîne d'observables donc je vais juste ajouter un autre cas courant où vous ne voulez pas transformer les données que vous recevez, mais une chaîne par une autre action (définition des données à une base de données, par exemple). Utilisation
.flatmap()
. Voici un exemple:C'est RxKotlin2, mais l'idée est la même chose avec RxJava & RxJava2:
Explication rapide:
mDataManager.fetchQuotesFromApi()
.io()
fil et de montrer les résultats sur.ui()
fil.onErrorResumeNext()
permet de s'assurer que, quelle que soit l'erreur de nous rencontrer à partir de l'extraction de données est pris dans cette méthode. Je veux mettre fin à l'ensemble de la chaîne quand il ya une erreur, alors je suis de retour d'unObservable.error()
.flatmap()
est le chaînage de la partie. Je veux être en mesure de définir toutes les données que je reçois de l'API à ma base de données. Je ne suis pas en transformant les données que j'ai reçu l'aide de.map()
, je suis tout simplement faire autre chose avec les données sans le transformer.onError()
) aveconErrorResumeNext()
flatmap()
). Toute erreur qui se produit par le biais de cette observable sera PAS être propagées à la dernièresubscribeBy()
méthodes, car elle est gérée à l'intérieur de lasubscribe()
méthode à l'intérieur de la.flatmap()
de la chaîne.Le code provient de ce projet qui se trouve ici: https://github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/dingerquotes/ui/start/StartPresenter.kt
essayez d'utiliser scan()