Je commence à utiliser RxJS et je ne comprends pas pourquoi dans cet exemple nous devons utiliser une fonction comme flatMap
ou concatAll
; où est le tableau de tableaux ici?
var requestStream = Rx.Observable.just('https://api.github.com/users');
var responseMetastream = requestStream
.flatMap(function(requestUrl) {
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
});
responseMetastream.subscribe(url => {console.log(url)})
Si quelqu'un peut expliquer visuellement ce qui se passe, ce sera très utile.
javascript
rxjs
utilisateur233232
la source
la source
flatMap
cela avait été nommémapThenFlatten
, alors ce serait moins déroutant.Réponses:
Quand j'ai commencé à y jeter un œil,
Rxjs
je suis également tombé sur cette pierre. Ce qui m'a aidé est le suivant:flatMap
: http://reactivex.io/documentation/operators/flatmap.htmlflatMap
là, vous devez regarder à lamergeMap
place (un autre nom).enfin en regardant les informations de type de RxJava. Javascript ne pas être tapé n'aide pas ici. Fondamentalement, si
Observable<T>
désigne un objet observable qui pousse des valeurs de type T,flatMap
prend alors une fonction de typeT' -> Observable<T>
comme argument et retourneObservable<T>
.map
prend une fonction de typeT' -> T
et retourneObservable<T>
.Pour revenir à votre exemple, vous avez une fonction qui produit des promesses à partir d'une chaîne d'URL. Alors
T' : string
, etT : promise
. Et d'après ce que nous avons dit auparavantpromise : Observable<T''>
, ouiT : Observable<T''>
, avecT'' : html
. Si vous mettez cette fonction de production de promessemap
, vous obtenezObservable<Observable<T''>>
quand ce que vous voulez estObservable<T''>
: vous voulez que l'observable émette leshtml
valeurs.flatMap
est appelé comme ça car il aplatit (supprime une couche observable) du résultatmap
. Selon votre parcours, cela peut être chinois pour vous, mais tout est devenu clair pour moi avec les informations de frappe et le dessin d'ici: http://reactivex.io/documentation/operators/flatmap.html .la source
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
enreturn jQuery.getJSON(requestUrl);
carflatMap
accepte également une fonction de sélection qui renvoie une promesse c'est-à-dire une fonction de typeT' -> Promise
.T’ -> T
? Je comprends leT
comme un générique, mais quelle est l'apostrophe et la flèche non grasse?Vous utilisez flatMap lorsque vous avez un observable dont les résultats sont plus observables.
Si vous avez une observable qui est produite par une autre observable, vous ne pouvez pas la filtrer, la réduire ou la mapper directement car vous avez une observable et non les données. Si vous produisez une observable, choisissez flatMap sur map; alors tu vas bien.
Comme dans le deuxième extrait de code, si vous effectuez une opération asynchrone, vous devez utiliser flatMap.
la source
flatMap
transformer les éléments émis par un observable en nouveaux observables, puis aplatir les émissions de ceux-ci en un seul observable.Découvrez le scénario ci-dessous où
get("posts")
renvoie un observable qui est «aplati» parflatMap
.la source
Les gens ont tendance à trop compliquer les choses en donnant la définition qui dit:
Je jure que cette définition me trouble encore mais je vais l'expliquer de la manière la plus simple qui soit en utilisant un exemple
Notre situation : nous avons une observable qui renvoie des données (URL simple) que nous allons utiliser pour faire un appel HTTP qui renverra une observable contenant les données dont nous avons besoin afin que vous puissiez visualiser la situation comme ceci:
comme vous pouvez le voir, nous ne pouvons pas accéder directement aux données dont nous avons besoin, donc la première façon de récupérer les données nous permet d'utiliser uniquement des abonnements normaux comme celui-ci:
cela fonctionne mais comme vous pouvez le voir, nous devons imbriquer des abonnements pour obtenir nos données, cela n'a pas l'air mal pour le moment, mais imaginez que nous avons 10 abonnements imbriqués qui deviendraient non maintenables.
donc une meilleure façon de gérer cela est simplement d'utiliser l'opérateur
flatMap
qui fera la même chose mais nous évite cet abonnement imbriqué:la source
Facile:
la source
Ce n'est pas un tableau de tableaux. C'est un observable d'observable (s).
Ce qui suit renvoie un flux de chaîne observable.
Bien que cela renvoie un flux observable de flux observable de json
flatMap
aplatit l'observable automatiquement pour nous afin que nous puissions observer directement le flux jsonla source
flatMap
(etmap
) ne sont pas spécifiques aux tableaux. Il est possible de définir ces opérations sur n'importe quel conteneur ou wrapper générique, y compris les tableaux, les dictionnaires, les "optionnels", les flux réactifs, les promesses, les pointeurs et même les fonctions elles-mêmes. C'est une propriété émergente d'une construction mathématique appelée la monade. Tous les exemples ci-dessus remplissent les conditions requises pour être une monade, et ils peuvent donc tous recevoir une définition demap
et aflatMap
(avec quelques mises en garde).Ici pour montrer l'implémentation équivalente d'un flatMap utilisant des abonnés
Sans flatMap:
Avec flatMap:
http://plnkr.co/edit/BHGmEcdS5eQGX703eRRE?p=preview
J'espère que cela pourrait aider.
Olivier.
la source
Un observable est un objet qui émet un flux d'événements: suivant, erreur et terminé.
Lorsque votre fonction renvoie un Observable, elle ne renvoie pas un flux, mais une instance de Observable. L'
flatMap
opérateur mappe simplement cette instance à un flux.C'est le comportement de
flatMap
par rapport àmap
: Exécuter la fonction donnée et aplatir l'objet résultant dans un flux.la source
Avec flatMap
Sans flatMap
la source
Je ne suis pas stupide mais j'ai dû lire ceci 10 fois et je ne comprends toujours pas. Quand j'ai lu l'extrait de code:
alors je pourrais comprendre ce qui se passe, ça fait deux choses:
*) Le mot de transformation indique que l'élément peut être transformé en autre chose.
Ensuite, l' opérateur de fusion devient clair, il effectue l'aplatissement sans le mappage. Pourquoi ne pas l'appeler mergeMap ? Il semble qu'il existe également un Alias mergeMap avec ce nom pour flatMap .
la source