description |
---|
Retorna un ConnectableObservable, que es un Observable que espera a que se haga una llamada a su método `connect` antes de empezar a emitir valores a sus Observadores |
💡 publish es equivalente a multicast(() => new Subject())
Signatura
publish<T, R>(selector?: OperatorFunction<T, R>): MonoTypeOperatorFunction<T> | OperatorFunction<T, R>
MonoTypeOperatorFunction<T> | OperatorFunction<T, R>
: Un ConnectableObservable
que, cuando se hace una llamada a su método connect
, hace que el Observable fuente emita valores a sus Observadores.
Convierte un Observable frío en un Observable caliente, utilizando el operador multicast junto a un Sujeto internamente.
Retorna un ConnectableObservable, que es un Observable que espera a que se haga una llamada a su método connect
antes de empezar a emitir valores a sus Observadores. En el caso de que no se llame a connect
, el Observable fuente no emitirá ningún valor.
💡 Para evitar tener que llamar a connect manualmente, se puede utilizar el operador refCount.
Compartir el Observable fuente con publish
import { ConnectableObservable, interval, timer } from "rxjs";
import { publish, tap, take } from "rxjs/operators";
// number$ no empezará a emitir valores hasta que se haga una llamada a connect
const number$ = interval(1000).pipe(take(4));
const multicasted$ = number$.pipe(
tap(() =>
console.log("Fuente compartida, efecto secundario se ejecuta una sola vez")
),
publish()
) as ConnectableObservable<number>;
// Llamando a connect tras 3 seconds
timer(3000)
.pipe(tap(() => multicasted$.connect()))
.subscribe();
multicasted$.subscribe((val) => console.log(`Observador 1: ${val}`));
multicasted$.subscribe((val) => console.log(`Observador 2: ${val}`));
/* Salida:
Fuente compartida, efecto secundario se ejecuta una sola vez,
Observador 1: 0,
Observador 2: 0,
(1s)
Fuente compartida, efecto secundario se ejecuta una sola vez,
Observador 1: 1,
Observador 2: 1,
...
*/
Convertir al Observable fuente en caliente, unir cada Observable interno en uno solo y suscribirse al Observable resultante
import { of, zip, interval, merge } from "rxjs";
import { map, publish, tap } from "rxjs/operators";
const source$ = zip(interval(2000), of(1, 2, 3, 4, 5, 6, 7, 8, 9)).pipe(
map((values) => values[1])
);
source$
.pipe(
publish((multicasted$) =>
merge(
multicasted$.pipe(tap((x) => console.log("Flujo 1:", x))),
multicasted$.pipe(tap((x) => console.log("Flujo 2:", x))),
multicasted$.pipe(tap((x) => console.log("Flujo 3:", x)))
)
)
)
.subscribe();
// Cada 2 segundos:
// 'Flujo 1: 1'
// 'Flujo 2: 1'
// 'Flujo 3: 1'
// ...
// 'Flujo 1: 9'
// 'Flujo 2: 9'
// 'Flujo 3: 9'
Sobrecargas
publish(): UnaryFunction<Observable<T>, ConnectableObservable<T>>
No recibe ningún parámetro.
UnaryFunction<Observable<T>, ConnectableObservable<T>>
publish(selector: (shared: Observable<T>) => O): OperatorFunction<T, ObservedValueOf<O>>
OperatorFunction<T, ObservedValueOf<O>>
publish(selector: MonoTypeOperatorFunction<T>): MonoTypeOperatorFunction<T>
MonoTypeOperatorFunction<T>