Documentación RxJS

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

Signatura

Firma

mergeScan<T, R>(accumulator: (acc: R, value: T, index: number) => any, seed: R, concurrent: number = Number.POSITIVE_INFINITY): OperatorFunction<T, R>

Parámetros

accumulatorLa función de acumulación que se aplica a cada valor emitido.
seedEl valor de acumulación inicial.
concurrentOpcional. El valor por defecto es Number.POSITIVE_INFINITY. El máximo número de Observables internos a los que se suscribe de forma concurrente.

Retorna

OperatorFunction<T, R>: Un Observable de los valores acumulados.

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

StackBlitz

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

StackBlitz

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

Source code

Documentación oficial en inglés