Acumula valores del Observable fuente en un Observable anidado (ventana), utilizando una función factoría de Observables para determinar cuándo abrir una nueva ventana
OperatorFunction<T, Observable<T>>: Un Observable de ventanas, que son Observables de valores.
Descripción
Es como bufferWhen, pero emite un Observable anidado en lugar de un array.
Retorna un Observable que emite ventanas de elementos que recoge del Observable fuente. El Observable resultante emite ventanas conectas, sin superposición. Emite la ventana actual y abre una ventana nueva cuando el Observable retornado por la función closingSelector emita un valor. La primera ventana se abre inmediatamente después de llevar a cabo la suscripción al Observable resultante.
Ejemplos
Recoger una secuencia ascendente de números en una ventana. Cada vez que se haga click, abrir una nueva ventana
import { fromEvent, interval } from"rxjs";import { windowWhen, mergeAll, tap, map } from"rxjs/operators";constkey$=fromEvent<KeyboardEvent>(document,"keydown");key$.pipe(map(({ code }) => code),windowWhen(() =>interval(1000+Math.random() *3000)),tap((_) =>console.log("Nueva ventana")),// Transformando el Observable de orden superior en uno de primer ordenmergeAll() ).subscribe(console.log);// Salida: Nueva ventana, KeyR, KeyX (x segundos aleatorios después) Nueva ventana, KeyJ, KeyS...
Ejemplo de la documentación oficial
Emitir únicamente los dos primeros eventos click en cada ventana de una duración aleatoria de entre 1 y 5 segundos
import { fromEvent, interval } from'rxjs';import { windowWhen, map, mergeAll, take } from'rxjs/operators';constclicks=fromEvent(document,'click');constresult=clicks.pipe(windowWhen(() =>interval(1000+Math.random() \*4000)),map(win =>win.pipe(take(2))),// Cada ventana contiene como mucho 2 emisionesmergeAll() // 'Aplastar' el Observable de Observables);result.subscribe(x =>console.log(x));