RxJS - 检测长鼠标按下

fee*_*lay 4 javascript rxjs reactive

我想检测何时mousedown被解雇超过 500 毫秒,如果是这样 - 做点什么。我的尝试:

const button = document.querySelector('button')
const stream = Rx.Observable.fromEvent(button, 'mousedown')
const mouseUp$ = Rx.Observable.fromEvent(button, 'mouseup')
stream.delay(500).takeUntil(mouseUp$).subscribe(() => console.log(1))
Run Code Online (Sandbox Code Playgroud)

它有效,但仅在第一次运行时有效。然后,由于takeUntil运营商,流被取消。如何让它每次都有效?

演示

Spl*_*lex 6

TimerObservable在每个mouseDown$事件上启动500 毫秒。如果mouseUp$获取的500毫秒内发射unsubscribeTimerObservable

const button = document.querySelector('button')
const mouseDown$ = Rx.Observable.fromEvent(button, 'mousedown')
const mouseUp$ = Rx.Observable.fromEvent(button, 'mouseup')

const stream$ = mouseDown$.switchMap(() => Rx.Observable.TimerObservable(500).takeUntil(mouseUp$));

stream$.subscribe(() => console.log('Only Fired after 500ms'))
Run Code Online (Sandbox Code Playgroud)

RxJS >= 6.0.0

import { switchMap, takeUntil } from 'rxjs/operators';
import { timer, fromEvent } from 'rxjs';

const button = document.querySelector('button')
const mouseDown$ = fromEvent(button, 'mousedown')
const mouseUp$ = fromEvent(button, 'mouseup')

const stream$ = mouseDown$.pipe(
  switchMap(() => timer(500).pipe(takeUntil(mouseUp$)))
);

stream$.subscribe(() => console.log('Only Fired after 500ms'))
Run Code Online (Sandbox Code Playgroud)