Resubscribe to takeUntil/skipUntil

馋奶兔 提交于 2019-12-08 06:31:44

问题


The following code defines behavior i want (it works). Emmition of mousemove event occur only when mouse down.

Rx.Observable.fromEvent(window,"mouseup")
.subscribe( 
  () => {
      if(subscription)
         subscription.dispose();
  }
) 

Rx.Observable.fromEvent(window,"mousedown")
.subscribe(
  () => {
      subscription = Rx.Observable.fromEvent(window,"mousemove")
                     .subscribe(
                       (event) => console.log(event)
                     )
  }
) 

I want to rewrite it using takeUntil/skipUntil operators. But this fails:

let fs =  [
  (e) => console.log(e),
  (err) => console.log(err),
  () => {
      console.log('done')  
      source.subscribe(...fs);
  }
 ];

let getDown = () => Rx.Observable.fromEvent(document,"mousedown");
let getUp = () => Rx.Observable.fromEvent(document,"mouseup");

let source = Rx.Observable.fromEvent(document,"mousemove")
.skipUntil(getDown())
.takeUntil(getUp());

source.subscribe(
   ...fs
)

How i can do this? Thanks!


回答1:


This problem is generally solved by projecting each element of the trigger stream into the desired source stream and then flattening things out (which is usually achieved using switchMap). In this case, you want to project downs into moves until ups. Something like this:

const source = getDown().switchMap(() => Rx.Observable.fromEvent(document, "mousemove").takeUntil(getUp());


来源:https://stackoverflow.com/questions/45264019/resubscribe-to-takeuntil-skipuntil

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!