Estoy tratando de comprender mejor mergemap recreando un ejemplo muy simple y no se está comportando como esperaba según mi comprensión de la descripción oficial.
En este ejemplo, cada clic sucesivo en el documento genera un solo resultado (es decir, la salida del observable "de", que es el comportamiento que habría esperado de switchmap. Mi comprensión de mergemap es que fusionará los resultados de múltiples observables internos que no parece ser el caso aquí.
Para examinar el ciclo de vida del observable, incluí la versión detallada de la función subscribe() para poder ver si se llama a complete(), pero no lo es, por lo que esperaba que los resultados de múltiples observables se acumularan con clics sucesivos en el documento y ser presentado en la salida en cada clic. Sin embargo, lo que sucede es que se crea un solo resultado observable nuevo cada vez. ¿Por qué cada clic sucesivo en el documento solo emite un flujo observable y descarta el anterior? ¿No es este el comportamiento de switchmap no mergemap?
fromEvent(document, 'click') .pipe(mergeMap(() => of(Date.now()))) .subscribe({ next(x) { console.log('value ', x); }, complete() { console.log('done'); }, });En este ejemplo, cada clic sucesivo en el documento genera un único resultado (es decir, el resultado del observable "de", que es el comportamiento que habría esperado del mapa de interruptores).
En este ejemplo, switchMap y mergeMap tienen el mismo comportamiento.
Aquí hay un código con el que puede jugar para ver dónde difieren los dos. Intente esto con mergeMap , switchMap y oye, ¿por qué no probar concatMap también?.
// Lets pretend we're grabbing the date from a server. // The server is slow, so this takes 3 seconds function getDate(): Observable<number> { return timer(3000).pipe( map(_ => Date.now()) ); } fromEvent(document, 'click').pipe( take(5), mergeMap(getDate) ).subscribe({ next: x => console.log('value ', x), complete: () => console.log('done') }); Notará cómo mergeMap mantiene cada 'clic' entrante del documento. Si hace 'clic' dos veces, habrá dos llamadas a getDate y ambas llamadas se mantendrán activas al mismo tiempo. 3 segundos después, la primera llamada se completará y emitirá un número y luego, unos momentos más tarde, la segunda llamada se completará y emitirá un número.
Una vez que haya hecho clic 5 veces y todas las llamadas resultantes a getDate completas, verá que su transmisión está lista.
Pruebe esto con switchMap y notará que si hace clic más de una vez en un intervalo de 3 segundos, el clic más antiguo se elimina en favor del más nuevo. switchMap solo permitirá que un solo observable interno (llamada a getDate) esté activo a la vez, por lo que cancela los antiguos y cambia a los nuevos.
Todo esto se vuelve más interesante cuando se trata de observables que emiten más de una vez.
la combinación en mergeMap no significa "combinar los elementos que emiten estos flujos". Significa "fusionar estas corrientes".