2017-07-23 7 views
0

Der folgende Code definiert das gewünschte Verhalten (funktioniert). Die Emmition des Mousemove-Ereignisses tritt nur auf, wenn die Maus nach unten bewegt wird.Erneutes Abonnieren von takeUntil/skipUntil

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

Ich möchte es mit takeUntil/skipUntil Operatoren umschreiben. Aber das schlägt fehl:

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 
) 

Wie kann ich das tun? Vielen Dank!

Antwort

1

Dieses Problem wird im Allgemeinen gelöst, indem jedes Element des Trigger-Stroms in den gewünschten Quellenstrom projiziert wird und dann die Dinge abgeflacht werden (was normalerweise unter Verwendung von switchMap erreicht wird). In diesem Fall möchten Sie in Bewegungen bis zu Ups projizieren. Etwas wie dieses:

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