在特定时间后重置扫描累加器RxJS

在特定时间后重置扫描累加器RxJS,rxjs,rxjs-pipeable-operators,Rxjs,Rxjs Pipeable Operators,我有一个fromEvent附加到input keydown事件。这样我就可以收听KeyEvents 在管道内部,我使用扫描操作符,因此我可以累积用户引入的最新3个键 我检查了扫描,累加器的长度,所以如果它已经是三,我会清理它(手动复位) 我需要一种方法,当用户输入时,在接下来的3000毫秒内,他可以一直输入,直到达到限制(3个键),但如果用户速度低于时间限制(3秒),下次他输入时,我将手动重置累加器 fromEvent(myInput.nativeElement, 'keydown').pi

我有一个fromEvent附加到input keydown事件。这样我就可以收听KeyEvents

在管道内部,我使用扫描操作符,因此我可以累积用户引入的最新3个键

我检查了扫描,累加器的长度,所以如果它已经是三,我会清理它(手动复位)

我需要一种方法,当用户输入时,在接下来的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));

我试图以某种方式将其与计时器合并,但我不知道如何合并。不知道如何到达那里。

您可以在此处使用
时间间隔
操作符,该操作符提供两次排放之间经过的时间以及值。沿着以下路线设置:

  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));
以下是一个有效的闪电战:


我以前从来没有遇到过一个操作员的用例,但在这里似乎可以非常有效地解决您的问题。

我在这里感到困惑。你想将累加器重置为3次按键或3秒,以先到者为准?确切地说是@bryan60-我将添加你的评论,因为它恢复了我在这里的明确目标。谢谢。每次击键都会重置3秒计时器吗?是的。只需一个小细节,它支持3次击键,当累加器为3并进入扫描时,它是第4次,因此我们重置并添加该键作为新结果的第一个值。可能,此if语句应该返回空数组,而不是赋值if(acc.length==3 | | val.interval>3000){return[]}@我不相信这是OP想要的。我认为它应该重置数组并发出新的值,如果>3秒,则PasseEdit可以像符咒一样工作,这正是我想要的,非常感谢。顺便说一下,我添加了类型:(val:TimeInterval)=>{。。。