mergeScan
Aplica una función de acumulación al Observable fuente donde la propia función de acumulación retorna un Observable. Cada Observable interno retornado se fusiona con el Observable resultante
Descripción
Es como scan
, pero los Observables retornados por el acumulador se fusionan en el Observable resultante.
Ejemplos
Contar el número de teclas pulsadas
import { fromEvent, of } from "rxjs";
import { mapTo, mergeScan } from "rxjs/operators";
const key$ = fromEvent(document, "keydown").pipe(mapTo(1));
key$.pipe(mergeScan((acc, one) => of(acc + one), 0)).subscribe(console.log);
// Salida: (Pulsar tecla) 1, (Pulsar tecla ) 2, (Pulsar tecla) 3...
Acumular el tiempo que esté pulsado el ratón
import { fromEvent, interval } from "rxjs";
import { mergeScan, takeUntil, map } from "rxjs/operators";
const mouseDown$ = fromEvent(document, "mousedown");
const mouseUp$ = fromEvent(document, "mouseup");
mouseDown$
.pipe(
mergeScan(
(acc, curr) =>
interval(1000).pipe(
takeUntil(mouseUp$),
map((n) => acc + n)
),
0
)
)
.subscribe(console.log, console.error);
// Salida: (ratón pulsado 5s) 0, 1, 2, 3, 4 (ratón pulsado 2s) 4, 5, 6...
Ejemplo de la documentación oficial
Contar el número de eventos click
import { fromEvent, of } from "rxjs";
import { mapTo, mergeScan } from "rxjs/operators";
const click$ = fromEvent(document, "click");
const one$ = click$.pipe(mapTo(1));
const seed = 0;
const count$ = one$.pipe(mergeScan((acc, one) => of(acc + one), seed));
count$.subscribe((x) => console.log(x));
// Salida:
// 1
// 2
// 3
// 4
// ...y así sucesivamente para cada click
Recursos adicionales
Last updated