Estoy empezando a usar RxJS y no entiendo por qué en este ejemplo necesitamos usar una función como flatMap
o concatAll
; ¿Dónde está la matriz de matrices aquí?
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 alguien puede explicar visualmente lo que está sucediendo, será muy útil.
javascript
rxjs
usuario233232
fuente
fuente
flatMap
hubiera sido nombradomapThenFlatten
, sería menos confuso.Respuestas:
Cuando comencé a echar un vistazo
Rxjs
también tropecé con esa piedra. Lo que me ayudó fue lo siguiente:flatMap
: http://reactivex.io/documentation/operators/flatmap.htmlflatMap
allí, debe buscar en sumergeMap
lugar (otro nombre).finalmente mirando la información de tipo de RxJava. Javascript no escrito no ayuda aquí. Básicamente, si
Observable<T>
denota un objeto observable que empuja valores de tipo T, entoncesflatMap
toma una función de tipoT' -> Observable<T>
como argumento y devuelveObservable<T>
.map
toma una función de tipoT' -> T
y devuelveObservable<T>
.Volviendo a su ejemplo, tiene una función que produce promesas a partir de una cadena de URL. Entonces
T' : string
, yT : promise
. Y por lo que dijimos antespromise : Observable<T''>
, entoncesT : Observable<T''>
, conT'' : html
. Si pones esa función de producción de promesasmap
, obtienesObservable<Observable<T''>>
cuando lo que quieres esObservable<T''>
: quieres que el observable emita loshtml
valores.flatMap
se llama así porque aplana (elimina una capa observable) del resultadomap
. Dependiendo de su experiencia, esto podría ser chino para usted, pero todo se volvió muy claro para mí al escribir información y el dibujo de aquí: http://reactivex.io/documentation/operators/flatmap.html .fuente
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
alreturn jQuery.getJSON(requestUrl);
queflatMap
también acepta una función del selector que devuelve una función promesa es decir, del tipoT' -> Promise
.T’ -> T
:? Entiendo elT
como genérico, pero ¿qué es el apóstrofe y la flecha sin grasa?Utiliza flatMap cuando tiene un Observable cuyos resultados son más Observables.
Si tiene un observable que es producido por otro observable, no puede filtrarlo, reducirlo o mapearlo directamente porque tiene un Observable, no los datos. Si produce un observable, elija flatMap sobre el mapa; entonces estás bien.
Como en el segundo fragmento, si está realizando una operación asincrónica, debe usar flatMap.
fuente
flatMap
transformar los elementos emitidos por un Observable en nuevos Observables, luego aplana las emisiones de esos en un Observable único.Vea el escenario a continuación donde
get("posts")
devuelve un Observable que está "aplanado" porflatMap
.fuente
La gente tiende a complicar demasiado las cosas al dar la definición que dice:
Juro que esta definición todavía me confunde, pero la voy a explicar de la manera más simple que es usando un ejemplo.
Nuestra situación : tenemos un observable que devuelve datos (URL simple) que vamos a usar para hacer una llamada HTTP que devolverá un observable que contiene los datos que necesitamos para que puedas visualizar la situación así:
como puede ver, no podemos acceder a los datos que necesitamos directamente, por lo que la primera forma de recuperar los datos podemos usar solo suscripciones normales como esta:
esto funciona, pero como puede ver, tenemos que anidar suscripciones para obtener nuestros datos, esto actualmente no se ve mal, pero imagine que tenemos 10 suscripciones anidadas que no se pueden mantener.
así que una mejor manera de manejar esto es simplemente usar el operador
flatMap
que hará lo mismo pero nos hace evitar esa suscripción anidada:fuente
Sencillo:
fuente
No es una matriz de matrices. Es un observable de observable (s).
Lo siguiente devuelve un flujo de cadena observable.
Si bien esto devuelve un flujo observable de flujo observable de json
flatMap
aplana lo observable automáticamente para que podamos observar la secuencia json directamentefuente
flatMap
(ymap
) no son especiales para las matrices. Es posible definir estas operaciones en cualquier contenedor o envoltorio genérico, incluyendo matrices, diccionarios, "opcionales", flujos reactivos, promesas, punteros e incluso funciones mismas. Ésta es una propiedad emergente de una construcción matemática llamada mónada. Todos los ejemplos anteriores cumplen los requisitos para ser una mónada, por lo que a todos se les puede dar una definición demap
y aflatMap
(con algunas salvedades).Aquí para mostrar la implementación equivalente de un flatMap usando suscripciones.
Sin flatMap:
Con flatMap:
http://plnkr.co/edit/BHGmEcdS5eQGX703eRRE?p=preview
Espero que pueda ayudar.
Olivier.
fuente
Un Observable es un objeto que emite una secuencia de eventos: Siguiente, Error y Completado.
Cuando su función devuelve un Observable, no devuelve un flujo, sino una instancia de Observable. El
flatMap
operador simplemente asigna esa instancia a una secuencia.Ese es el comportamiento de
flatMap
cuando se compara conmap
: Ejecutar la función dada y aplanar el objeto resultante en una secuencia.fuente
Con flatMap
Sin flatMap
fuente
No soy estúpido, pero tuve que leer esto 10 veces y todavía no lo entiendo. Cuando leo el fragmento de código:
entonces pude entender lo que está pasando, hace dos cosas:
*) La palabra transformar dice que el elemento se puede transformar en otra cosa.
Luego, el operador de combinación se vuelve claro, realiza el aplanamiento sin el mapeo. ¿Por qué no llamarlo mergeMap ? Parece que también hay un Alias mergeMap con ese nombre para flatMap .
fuente