Rxjs 取消使用“取消”创建的可观察对象;fromEvent“;然后换一个新的

Rxjs 取消使用“取消”创建的可观察对象;fromEvent“;然后换一个新的,rxjs,Rxjs,我的目标是在1秒的时间间隔内再次发出“hi”,直到按下一个键,并在鼠标单击时继续。 这是我的密码: import { of, fromEvent, interval } from 'rxjs'; import { map, tap, takeUntil,take, repeatWhen, shareReplay, switchMap , takeLast} from 'rxjs/operators'; const fromKeyUp$ = fromEvent(window, 'keyup')

我的目标是在1秒的时间间隔内再次发出“hi”,直到按下一个键,并在鼠标单击时继续。 这是我的密码:

import { of, fromEvent, interval } from 'rxjs'; 
import { map, tap, takeUntil,take, repeatWhen, shareReplay, switchMap , takeLast} from 'rxjs/operators';

const fromKeyUp$ = fromEvent(window, 'keyup').pipe(tap(_=> console.log('keyup')));

const fromMouseUp$ = fromEvent(window, 'mouseup').pipe(tap(_=> console.log('mouseup')));

const source = interval(1000).pipe(tap(_ => {
  console.log('hi again');
}), takeUntil(fromKeyUp$), repeatWhen(() => fromMouseUp$));

source.subscribe();
问题是,当鼠标点击次数过多时=>“hi-reach”会比平时发出更多的信息

我尝试使用
switchMap
取消以前的鼠标操作,如:

const fromMouseUp$ = fromEvent(window, 'mouseup').pipe(switchMap(() => tap(_=> console.log('mouseup'))));
但它不起作用,因为水龙头不是用来创作的


有什么想法吗?

下面的代码将通过mouseup或keyup切换值,您可以将处理逻辑放入mergeMap中

const fromKeyUp$=fromEvent(窗口,'keyup').pipe(点击(=>console.log('keyup')),映射到(false));
const fromMouseUp$=fromEvent(窗口'mouseup').pipe(点击(=>console.log('mouseup')),映射到(true));
常数时间间隔=间隔(1000)。管道(
轻触(=>{
console.log('hi reach');
}))
const source=CombineTest(时间间隔,合并(fromMouseUp$,fromKeyUp$).pipe(startWith(true))
).烟斗(
合并映射(([value,through])=>through?
of(value):never(),distinctUntilChanged()
)

source.subscribe(console.log)
我认为您可以对操作符重新排序,然后使用
switchMap
取消上一个
间隔

fromMouseUp$.pipe(
  startWith(null),
  switchMap(() => interval(1000).pipe(
    takeUntil(fromKeyUp$),
  )),
).subscribe();

我不明白你想成为什么样的人honest@martin我想以1秒的间隔再次发出“hi”。我想在按下某个键时停止,然后单击鼠标重新开始。我的问题是,在“再次hi”的过程中,许多鼠标点击会在1秒的时间间隔内发出刹车,“再次hi”被写入的次数太多。console.log(“再次hi”)应该在哪里?在
时间间隔内
管道中
takeUntil
之前调用。