OperatorFunction<T, Observable<T>>: Un Observable de ventanas, que son Observables de valores.
Descripción
Es como bufferTime, pero emite un Observable anidado en lugar de un array.
Retorna un Observable que emite ventanas de elementos que recoge del Observable fuente. Cada ventana se emite tras un periodo de tiempo determinado por el argumento windowTimeSpan. Cuando el Observable fuente se complete o lance un error, el Observable resultante emitirá la ventana actual y propagará la notificación del Observable fuente. Si no se proporciona el argumento windowCreationInterval, el Observable resultante abrirá una nueva ventana en cuanto la ventana anterior esté completa. Con el argumento maxWindowCount, cada ventana emitirá, como mucho, el número de valores indicado. Con el argumento windowCreationInterval se puede determinar cuándo abrir nuevas ventanas de forma periódica.
Ejemplos
Recoge teclas pulsadas en una nueva ventana cada 5s
import { fromEvent } from"rxjs";import { mergeAll, map, tap, windowTime } from"rxjs/operators";constkey$=fromEvent<KeyboardEvent>(document,"keydown");key$.pipe(map(({ code }) => code),windowTime(5000),tap((_) =>console.log("Nueva Ventana")),// Transformando el Observable de orden superior en uno de primer ordenmergeAll() ).subscribe(console.log);// Salida: Nueva Ventana, KeyR, KeyX, KeyJ, KeyS (5s) Nueva Ventana, KeyO...
Ejemplos de la documentación oficial
Emitir como mucho 2 eventos click en ventanas de 1s
import { fromEvent } from"rxjs";import { windowTime, map, mergeAll, take } from"rxjs/operators";constclicks=fromEvent(document,"click");constresult=clicks.pipe(windowTime(1000),map((win) =>win.pipe(take(2))),// Cada ventana contiene como mucho 2 emisionesmergeAll() // 'Aplastar' el Observable de Observables);result.subscribe((x) =>console.log(x));
Emitir como mucho 2 eventos click en ventanas de 1s, abriendo una ventana nueva cada 5s
import { fromEvent } from"rxjs";import { windowTime, map, mergeAll, take } from"rxjs/operators";constclicks=fromEvent(document,"click");constresult=clicks.pipe(windowTime(1000,5000),map((win) =>win.pipe(take(2))),// Cada ventana contiene como mucho 2 emisionesmergeAll() // 'Aplastar' el Observable de Observables);result.subscribe((x) =>console.log(x));
Igual que el ejemplo anterior, pero con maxWindowCount en lugar del operador take
import { fromEvent } from"rxjs";import { windowTime, mergeAll } from"rxjs/operators";constclicks=fromEvent(document,"click");constresult=clicks.pipe(windowTime(1000,5000,2),// Cada ventana contiene como mucho 2 emisionesmergeAll() // 'Aplastar' el Observable de Observables);result.subscribe((x) =>console.log(x));