La definición de rxjava doc de switchmap es bastante vaga y se vincula a la misma página que flatmap. ¿Cuál es la diferencia entre los dos operadores?
reactive-programming
rx-java
Julian Go
fuente
fuente
Respuestas:
De acuerdo con la documentación ( http://reactivex.io/documentation/operators/flatmap.html )
the
switchMap
es como elflatMap
, pero solo emitirá elementos del nuevo observable hasta que se emita un nuevo evento desde el origen observable.El diagrama de mármol lo muestra bien. Observe la diferencia en los diagramas:
En
switchMap
la segunda emisión original ( mármol verde ) no se emite su segunda emisión mapeada ( cuadrado verde ), ya que la tercera emisión original ( mármol azul ) ha comenzado y ya emitió su primera emisión mapeada ( diamante azul ). En otras palabras, solo ocurre la primera de las dos emisiones verdes mapeadas ; no se emite un cuadrado verde porque el diamante azul lo venció.En
flatMap
, se emitirán todos los resultados asignados, incluso si están "obsoletos". En otras palabras, tanto la primera como la segunda de las emisiones verdes mapeadas suceden: se habría emitido un cuadrado verde (si usaran una función de mapa consistente; como no lo hicieron, verá el segundo diamante verde, a pesar de que se emite después el primer diamante azul)switchMap
mapa plano
fuente
.map(func).switch
, pero es lo mismo que.switchMap(func)
.Me encontré con esto al implementar la "búsqueda instantánea", es decir, cuando el usuario escribe en un cuadro de texto y los resultados aparecen casi en tiempo real con cada pulsación de tecla. La solución parece ser:
Con flatMap, los resultados de búsqueda podrían ser obsoletos, porque las respuestas de búsqueda pueden volverse fuera de orden. Para solucionar esto, se debe usar switchMap, ya que garantiza que un observable antiguo se da de baja una vez que se proporciona uno nuevo.
Entonces, en resumen, flatMap debe usarse cuando todos los resultados importan, independientemente de su tiempo, y switchMap debe usarse cuando solo resultan de la última materia Observable.
fuente
Ninguna discusión de flatMap está completa sin comparar y contrastar con
switchMap
,concatMap
yconcatMapEager
.Todos estos métodos toman una
Func1
que transforma la corriente enObservable
s que luego se emiten; la diferencia es cuando losObservable
mensajes devueltos se suscriben y anulan, y en casoObservable
de que el____Map
operador en cuestión emita las emisiones de esos mensajes .flatMap
se suscribe a tantosObservable
s emitidos como sea posible. (Es un número dependiente de la plataforma. Por ejemplo, un número más bajo en Android) Úselo cuando el pedido NO sea importante y desee emisiones lo antes posible.concatMap
se suscribe al primeroObservable
y solo se suscribe al siguienteObservable
cuando se haya completado el anterior. Úselo cuando el pedido sea importante y desee conservar recursos. Un ejemplo perfecto es aplazar una llamada de red comprobando primero el caché. Esto generalmente puede ser seguido por una.first()
o.takeFirst()
para evitar hacer un trabajo innecesario.http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/
concatMapEager
funciona de la misma manera, pero se suscribe a la mayor cantidad posible (depende de la plataforma), pero solo se emitirá una vez que seObservable
haya completado lo anterior . Perfecto cuando tiene mucho procesamiento paralelo que debe hacerse, pero (a diferencia de flatMap) desea mantener el orden original.switchMap
se suscribirá al últimoObservable
que encuentre y se dará de baja de todos los correos electrónicos anterioresObservable
. Esto es perfecto para casos como sugerencias de búsqueda: una vez que un usuario ha cambiado su consulta de búsqueda, la solicitud anterior ya no tiene ningún interés, por lo que se cancela la suscripción y un punto final de Api con buen comportamiento cancelará la solicitud de red.Si está devolviendo
Observable
mensajes de correo electrónico que no tienensubscribeOn
otro hilo, todos los métodos anteriores pueden comportarse de la misma manera. El comportamiento interesante y útil surge cuando permite que losObservable
s anidados actúen en sus propios hilos. Entonces se puede obtener obtener una gran cantidad de beneficios de procesamiento en paralelo, de forma inteligente y darse de baja o no suscribirse deObservable
s que no le interesan a suSubscriber
samb
También puede ser de interés. Dado cualquier número deObservable
s, emite los mismos elementos que el primeroObservable
en emitir algo. Eso podría ser útil cuando tiene múltiples fuentes que podrían / deberían devolver lo mismo y desea rendimiento. por ejemplo, ordenar, puedeamb
ordenar rápidamente con una combinación de clasificación y usar el que sea más rápido.fuente
If you are returning Observables that don't subscribeOn another thread, all of the above methods may behave much the same.
- Cada explicación queswitchMap vs flatMap
encontré antes, perdí este aspecto importante, ahora todo está más claro. Gracias.switchMap alguna vez se llamó flatMapLatest en RxJS 4.
Básicamente, solo pasa los eventos del último Observable y se da de baja del anterior.
fuente
Mapa, FlatMap, ConcatMap y SwitchMap aplica una función o modifica los datos emitidos por un observable.
El mapa modifica cada elemento emitido por una fuente Observable y emite el elemento modificado.
FlatMap, SwitchMap y ConcatMap también aplica una función en cada elemento emitido, pero en lugar de devolver el elemento modificado, devuelve el Observable mismo que puede emitir datos nuevamente.
El trabajo de FlatMap y ConcatMap es prácticamente el mismo. Fusionan elementos emitidos por múltiples observables y devuelve un solo observable.
fuente
Si buscas un código de ejemplo
Puede ver más ejemplos aquí https://github.com/politrons/reactive
fuente
switchMap
con elflatMap
que va a funcionar exactamente igual.Aquí está el ejemplo más: 101 líneas de largo . Eso explica la cosa para mí.
Como se dijo: obtiene el último observable (el más lento si se quiere) e ignora el resto.
Como resultado:
Ves que la A fue ignorada.
fuente