RxJS:debounceTime返回所有值

时间:2017-04-11 16:17:37

标签: angular typescript rxjs

如果没有其他事件发生,是否可以延迟运行序列,并立即返回所有值?

我需要某种debounceTime func,但这会返回所有值。

3 个答案:

答案 0 :(得分:4)

如果我理解正确,您需要一个缓冲事件的运算符,直到某段时间没有事件发生,然后重复所有缓冲的事件。我会试试这个:

将此新运算符设置为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;

然后将其用作运算符:

yourSourceObservable.bufferedDebounceTime(1000).subscribe(...)

答案 1 :(得分:1)

编辑

bufferTime确实永远像一个间隔,因此不建议这样做。正如JørgenTvedt所评论的那样,debounceTime + buffer正是您所需要的。

但是,因为这是一个非常有用的运算符。我创建了一个使一切变得更加轻松的自定义商品,我将其称为 bufferDebounce

我将它作为Typescript中的OperatorFunction强制沿管道进行类型推断:

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();
      },
  })
);

您可以在此工作示例https://stackblitz.com/edit/rxjs6-buffer-debounce

中自己进行测试

上级答案

使用RXJS 6+,您可以非常轻松地做到这一点。

正如ZahiC所述,答案是使用缓冲区,但是具体来说,您可以使用bufferTime How to use bufferTime

因此,无论您的source在哪里(可以观察到),您都可以:

    // This will capture all responses, and return it in an Array every 2 secs
    const example = source.pipe(bufferTime(2000));

答案 2 :(得分:0)

bufferdebunceTime可以一起使用以实现此目标。查看这篇文章:

https://dev.to/datadeer/debounced-aggregated-buffered-actions-with-rxjs-6-3koa