Javascript 如何从takeUntil中的stop observable中获取值

Javascript 如何从takeUntil中的stop observable中获取值,javascript,reactive-programming,rxjs5,Javascript,Reactive Programming,Rxjs5,我正在做一些类似的事情,虽然不完全像拖放。我想单击>跟踪预览的移动>再次单击时停止跟踪>从上次单击中获取元数据。但是,用户可以单击多个项目来停止跟踪,我想知道这是什么,因为根据单击的第二个项目,副作用是不同的 基本上是 clickSomething$ = merge(anythingTheyCanClick); click$.switchMap(click => moveData.takeUntil(clickSomething$)) //need to get value from cl

我正在做一些类似的事情,虽然不完全像拖放。我想单击>跟踪预览的移动>再次单击时停止跟踪>从上次单击中获取元数据。但是,用户可以单击多个项目来停止跟踪,我想知道这是什么,因为根据单击的第二个项目,副作用是不同的

基本上是

clickSomething$ = merge(anythingTheyCanClick);
click$.switchMap(click => moveData.takeUntil(clickSomething$)) //need to get value from clickSomething$

这是从takeUntill中可观察到的停止获取值的特定请求,但如果这不可能或不可行,则包容性缓冲区或窗口技术(例如,点击时缓冲/窗口,但保持点击)也可以解决该问题

您可以将所有stopper observable合并在一起(obstop$),映射第一个stop事件以将其与mousemove区分开来,只获取一个这样的事件,并使用伪“close-takeUntil”事件进行concat。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));