¿Es posible ejecutar la secuencia con retraso, si no se producen otros eventos, y devolver todos los valores a la vez?
Necesito algún tipo de función debounceTime , pero eso devolverá todos los valores.
Si entiendo correctamente, necesita un operador que almacene eventos en búfer hasta que no ocurra ningún evento durante un cierto período de tiempo, luego repite todos los eventos almacenados en búfer. Yo intentaría esto:
Establezca este nuevo operador en el prototipo Observable:
function bufferedDebounceTime(time) { return Observable.create(subscriber => { let buffer = []; return this.do(x => buffer.push(x)) .debounceTime(time) .flatMap(() => buffer) .do(() => buffer = []) .subscribe( value => subscriber.next(value), err => subscriber.error(err), () => subscriber.complete() ); }); } Observable.prototype.bufferedDebounceTime = bufferedDebounceTime;Luego utilízalo como un operador:
yourSourceObservable.bufferedDebounceTime(1000).subscribe(...)EDITAR
bufferTime hecho actúa como un intervalo para siempre, por lo que no se recomienda. Como comentó Jørgen Tvedt, debounceTime + buffer es lo que está buscando.
Sin embargo, porque este es un operador muy útil. Creé mi personalizado que hace que todo sea mucho más fácil, lo llamé bufferDebounce
Lo hice como una función de operador en TypeScript para forzar la inferencia de tipos a lo largo de la canalización:
type BufferDebounce = <T>(debounce: number) => OperatorFunction<T, T[]>; const bufferDebounce: BufferDebounce = debounce => source => new Observable(observer => source.pipe(buffer(source.pipe(debounceTime(debounce)))).subscribe({ next(x) { observer.next(x); }, error(err) { observer.error(err); }, complete() { observer.complete(); }, }) );Puede probarlo usted mismo en este ejemplo de trabajo https://stackblitz.com/edit/rxjs6-buffer-debounce
RESPUESTA ANTERIOR
Con RXJS 6+ puedes hacer esto muy fácilmente.
Como mencionó ZahiC, la respuesta es con buffers, pero específicamente puedes hacer todo eso con bufferTime Cómo usar bufferTime
Entonces, donde sea que esté su source (como observable), puede:
// This will capture all responses, and return it in an Array every 2 secs const example = source.pipe(bufferTime(2000));buffer y debunceTime se pueden usar juntos para lograr este objetivo. Mira este artículo:
https://dev.to/datadeer/debounced-aggregated-buffered-actions-with-rxjs-6-3koa