重新订阅takeUntil / skipUntil [英] Resubscribe to takeUntil/skipUntil

查看:182
本文介绍了重新订阅takeUntil / skipUntil的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码定义了我想要的行为(它的工作原理)。只有当鼠标按下时才会发生mousemove事件的发生。

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)
                     )
  }
) 

我想用takeUntil / skipUntil运算符重写它。但这失败了:

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!

推荐答案

这个问题通常通过将触发流的每个元素投影到所需的源流中然后展平出来来解决。 (通常使用 switchMap 实现)。在这种情况下,您希望将向下投射到移动直到上升。这样的事情:

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());

这篇关于重新订阅takeUntil / skipUntil的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆