2017-07-23 25 views
0

以下代碼定義我想要的行爲(它的工作原理)。 mousemove事件的發生只在鼠標關閉時發生。取消takeUntil/skipUtill

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操作符來重寫它。但是這個失敗:

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 
) 

我該怎麼做?謝謝!

回答

1

這個問題通常通過將觸發流的每個元素投影到所需的源流中然後展平(通常使用switchMap實現)來解決。在這種情況下,你需要投入下降,直到上升。類似這樣的:

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