mergeScan<T, R>(accumulator: (acc: R, value: T, index: number) => any, seed: R, concurrent: number = Number.POSITIVE_INFINITY): OperatorFunction<T, R>
| accumulator | La función de acumulación que se aplica a cada valor emitido. |
| seed | El valor de acumulación inicial. |
| concurrent | Opcional. El valor por defecto es Number.POSITIVE_INFINITY.
El máximo número de Observables internos a los que se suscribe de forma concurrente. |
OperatorFunction<T, R>: Un Observable de los valores acumulados.
Es como scan, pero los Observables retornados por el acumulador se fusionan en el Observable resultante.
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...
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
Documentación oficial en inglés