如果没有其他事件发生,是否可以延迟运行序列,并立即返回所有值?
我需要某种debounceTime
func,但这会返回所有值。
答案 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)
buffer
和debunceTime
可以一起使用以实现此目标。查看这篇文章:
https://dev.to/datadeer/debounced-aggregated-buffered-actions-with-rxjs-6-3koa