您可以合并所有可观察到的阻塞物(obsStop $),映射第一个停止事件以将其与mousemove区分开来,仅采用一个此类事件并用伪'close - takeUntil'事件进行连接。 takeWhile将采取所有的鼠标移动和关闭事件,直到虚拟'close - takeUntil'事件来临。
let start = document.getElementById('start');
let stop1 = document.getElementById('stop1');
let stop2 = document.getElementById('stop2');
let stop3 = document.getElementById('stop3');
let start$ = Rx.Observable.fromEvent(start, 'click');
let stop1$ = Rx.Observable.fromEvent(stop1, 'click');
let stop2$ = Rx.Observable.fromEvent(stop2, 'click');
let stop3$ = Rx.Observable.fromEvent(stop3, 'click');
let obsStop$ = Rx.Observable.merge(stop1$, stop2$, stop3$);
start$.switchMap(x => {
return Rx.Observable.fromEvent(document, 'mousemove')
.merge(obsStop$
.map(event => {
return {stopClick: true, event: event};
})
.take(1)
.concat(Rx.Observable.of('takeUntil')))
.takeWhile(x => x !== 'takeUntil')
}).subscribe(x => console.log(x));