一定时间后重置扫描累加器 RxJS
Reset Scan Accumulator RxJS after certain time
我有一个 fromEvent 附加到输入按键事件。这样我就可以收听KeyEvents了。
在pipe里面,我用的是scan算子,所以可以累积用户最近引入的3个key
我检查了扫描,累加器长度,所以如果它已经是三个,我会清理它(手动重置)。
我需要一种方法,当用户输入时,在接下来的 3000 毫秒内,他可以继续输入直到达到限制(3 个键)但是如果用户慢于时间限制(3 秒),下次他输入,我会手动重置累加器。
fromEvent(myInput.nativeElement, 'keydown').pipe(
tap(e => e.preventDefault()),
scan((acc: KeyboardEvent[], val: KeyboardEvent) => {
// Add condition here to manually reset the accumulator...
if (acc.length === 3) {
acc = [];
}
return [...acc, val];
}, []),
takeUntil(this.destroy$)
).subscribe((events: KeyboardEvent[]) => console.log(events));
我曾尝试以某种方式将它与计时器合并,但我不知道该怎么做。不确定如何到达那里。
您可以在此处使用 timeInterval
运算符,它会为您提供两次发射之间经过的时间以及值。按照以下方式设置:
fromEvent(myInput.nativeElement, 'keydown').pipe(
tap(e => e.preventDefault()),
timeInterval(), // just add this operator, will convert to shape {value: T, interval: number}
scan((acc: KeyboardEvent[], val) => {
// Add condition here to manually reset the accumulator...
// also check the interval
if (acc.length === 3 || val.interval > 3000) {
acc = [];
}
return [...acc, val.value];
}, []),
takeUntil(this.destroy$)
).subscribe((events: KeyboardEvent[]) => console.log(events));
这是一个有效的闪电战:https://stackblitz.com/edit/rxjs-dxfb37?file=index.ts
不是我以前用过的操作员,但似乎可以非常有效地解决您的问题。
我有一个 fromEvent 附加到输入按键事件。这样我就可以收听KeyEvents了。
在pipe里面,我用的是scan算子,所以可以累积用户最近引入的3个key
我检查了扫描,累加器长度,所以如果它已经是三个,我会清理它(手动重置)。
我需要一种方法,当用户输入时,在接下来的 3000 毫秒内,他可以继续输入直到达到限制(3 个键)但是如果用户慢于时间限制(3 秒),下次他输入,我会手动重置累加器。
fromEvent(myInput.nativeElement, 'keydown').pipe(
tap(e => e.preventDefault()),
scan((acc: KeyboardEvent[], val: KeyboardEvent) => {
// Add condition here to manually reset the accumulator...
if (acc.length === 3) {
acc = [];
}
return [...acc, val];
}, []),
takeUntil(this.destroy$)
).subscribe((events: KeyboardEvent[]) => console.log(events));
我曾尝试以某种方式将它与计时器合并,但我不知道该怎么做。不确定如何到达那里。
您可以在此处使用 timeInterval
运算符,它会为您提供两次发射之间经过的时间以及值。按照以下方式设置:
fromEvent(myInput.nativeElement, 'keydown').pipe(
tap(e => e.preventDefault()),
timeInterval(), // just add this operator, will convert to shape {value: T, interval: number}
scan((acc: KeyboardEvent[], val) => {
// Add condition here to manually reset the accumulator...
// also check the interval
if (acc.length === 3 || val.interval > 3000) {
acc = [];
}
return [...acc, val.value];
}, []),
takeUntil(this.destroy$)
).subscribe((events: KeyboardEvent[]) => console.log(events));
这是一个有效的闪电战:https://stackblitz.com/edit/rxjs-dxfb37?file=index.ts
不是我以前用过的操作员,但似乎可以非常有效地解决您的问题。