Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跨时间跨度收集键盘输入_Javascript_Angular_Rxjs - Fatal编程技术网

Javascript 跨时间跨度收集键盘输入

Javascript 跨时间跨度收集键盘输入,javascript,angular,rxjs,Javascript,Angular,Rxjs,我正在使用Angular 10,并尝试使用RXJS在一定时间内收集window:keyup事件,但不幸的是,这一点都不太成功。基本上我想输入数据,如果在一定时间内没有按键,请求应该被提交 fromEvent(window, 'keyup').pipe( map((ev: KeyboardEvent) => ev.key), scan((acc, value) => acc + value), debounceTime(500) ).subscribe(key =>

我正在使用Angular 10,并尝试使用RXJS在一定时间内收集
window:keyup
事件,但不幸的是,这一点都不太成功。基本上我想输入数据,如果在一定时间内没有按键,请求应该被提交

fromEvent(window, 'keyup').pipe(
  map((ev: KeyboardEvent) => ev.key),
  scan((acc, value) => acc + value),
  debounceTime(500)
).subscribe(key => {
  console.log(key);
});
这就是我的基本方法,基本上是做我想做的事情,但是我无法删除订阅结果中的扫描结果


有没有更好的方法来实现我想要的行为?

我发现的一种方法是在旁边使用
主题
,让它发出一个可观察的结果,该结果为每个生成的字符串设置并销毁自己:

const result$=new Subject();
fromEvent(窗口“keyup”)。管道(
排气图(键=>fromEvent(窗口“keyup”)。管道(
takeUntil(结果$),
startWith(键),
映射((事件:KeyboardEvent)=>event.key),
扫描((acc,curr)=>acc+curr),
去BounceTime(500),
点击(val=>result$.next(val)),
)),
).subscribe();
结果$.subscribe(console.log);//在这里,您可以执行请求逻辑,
//并确保将其设置为“取消订阅”
//(例如,使用takeUntil和destroy$主题)。

当按下第一个键时,它将设置外部可观察对象。然后,它创建内部可观察对象,观察按下的每一个键,直到500毫秒的去抖动时间过去,在这一点上它会使对象发出光。同一个物体的发射杀死了内部可观察物,允许外部可观察物再次启动。不要忘了在主体和外部可观察对象上使用取消订阅方法。

为什么需要管道中的
扫描
方法?OP将不同的键值连接成一个字符串。这是一个有趣的问题,我正在寻找解决方案^^