2017-03-15 4 views
0

ich einen Schlüssel-Service für eine Tastatur gesteuerte Schnittstelle gemacht habe, und ich habe festgestellt, dass es die gesamte Kette für jeden Teilnehmer auszuführen scheint:RxJS Observable.fromEvent Kette für jeden Teilnehmer Brennen

this.documentKeyEvent = Observable.fromEvent(document, 'keydown') 
    .do((e: KeyboardEvent) => console.log(e.keyCode || e.which)) 
    .filter((e: KeyboardEvent) => !isKeyModified(e) && !!Keys[remap(e.keyCode || e.which)]) 
    .do((e: KeyboardEvent) => e.preventDefault()) 
    .throttle(() => Observable.timer(100)) 
    .map((e: KeyboardEvent) => remap(e.keyCode || e.which)); 

Die console.log in der ersten .do() führt dreimal, weil es drei Abonnenten gibt. Dies ist nicht unbedingt ein Problem, aber es scheint so, als würde es ziemlich ineffizient werden, wenn mehr Komponenten es abonnieren.

Gibt es eine Möglichkeit, diese Kette nur einmal pro Ereignis auszuführen, und dann diese Ergebnisse an alle Abonnenten zu senden, um dann zu tun, was immer sie wollen?

Dank

+0

können Sie [veröffentlichen] (http://reactivex.io/documentation/operators/publish.html) es. Beachten Sie jedoch, dass Sie auch [Verbinden] (http://reactivex.io/documentation/operators/connect.html) oder [RefCount] (http://reactivex.io/documentation/operators/refcount.html) benötigen. –

+0

Oder verwenden Sie ['share'] (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-share) – olsn

+0

Schön. * Dies ist ein Alias ​​für .publish(). RefCount() * –

Antwort

2

Ja, Sie entweder share als letzte Betreiber verwenden:

this.documentKeyEvent = Observable.fromEvent(document, 'keydown') 
    .do((e: KeyboardEvent) => console.log(e.keyCode || e.which)) 
    .filter((e: KeyboardEvent) => !isKeyModified(e) && !!Keys[remap(e.keyCode || e.which)]) 
    .do((e: KeyboardEvent) => e.preventDefault()) 
    .throttle(() => Observable.timer(100)) 
    .map((e: KeyboardEvent) => remap(e.keyCode || e.which)) 
    .share(); 

Dies wird im Wesentlichen teilen sich den Strom zwischen allen Teilnehmern.

Hinweis: share ist ein Alias ​​für publish().refCount() - siehe die Dokumentation für Details auf: publish

Verwandte Themen