share
Comparte el Observable fuente entre varios suscriptores
💡 Se puede utilizar share para convertir un Observable frío en uno caliente
💡 share es como utilizar multicast con un Sujeto y refCount
Descripción
Comparte las emisiones del Observable fuente entre todos sus suscriptores.
Retorna un Observable nuevo que multidifunde (comparte) el Observable original. Mientras haya al menos un suscriptor, el Observable emitirá valores. Cuando todos los Suscriptores hayan cancelado la suscripción al Observable compartido, share
cancelará la suscripción al Observable fuente. Dado que el Observable está multidifundido, el flujo es caliente.
share
es un alias de multicast(() => new Subject()), refCount()
.
Ejemplos
Por defecto, los Observables son fríos. Esto quiere decir que con cada suscripción, se vuelve a crear el productor subyacente. Por tanto, si un Observable realiza una petición AJAX, cada vez que reciba una suscripción nueva, volverá a hacer la petición. Este comportamiento se puede observar en el siguiente ejemplo:
import { map, mergeAll, take, tap } from "rxjs/operators";
import { ajax } from "rxjs/ajax";
const ghibliFilm$ = ajax.getJSON("https://ghibliapi.herokuapp.com/films").pipe(
tap((_) => console.log("Nueva petición")),
mergeAll(),
take(1)
);
const ghibliFilmTitle$ = ghibliFilm$.pipe(map(({ title }) => title));
const ghibliFilmDescription$ = ghibliFilm$.pipe(
map(({ description }) => description)
);
ghibliFilmTitle$.subscribe(console.log);
ghibliFilmDescription$.subscribe(console.log);
/* Salida:
'Nueva petición'
'Castle in the Sky',
'Nueva petición',
'The orphan Sheeta inherited a mysterious crystal that links her to the mythical...'
*/
Sin embargo, si se utiliza el operador share
para multidifundir (compartir) los valores del Observable entre todos sus suscriptores. De esta manera, el Observable frío se convierte en uno caliente, y, en el caso del ejemplo anterior, la petición AJAX no se repite con cada nueva suscripción.
import { map, mergeAll, share, take, tap } from "rxjs/operators";
import { ajax } from "rxjs/ajax";
const ghibliFilm$ = ajax.getJSON("https://ghibliapi.herokuapp.com/films").pipe(
tap((_) => console.log("Nueva petición")),
mergeAll(),
take(1),
share()
);
const ghibliFilmTitle$ = ghibliFilm$.pipe(map(({ title }) => title));
const ghibliFilmDescription$ = ghibliFilm$.pipe(
map(({ description }) => description)
);
ghibliFilmTitle$.subscribe(console.log);
ghibliFilmDescription$.subscribe(console.log);
/* Salida:
'Nueva petición'
'Castle in the Sky',
'The orphan Sheeta inherited a mysterious crystal that links her to the mythical...'
*/
Recursos adicionales
Last updated