2017-03-15 34 views
0

我做了一個重要的服務爲鍵盤式界面,我發現,它似乎執行每個用戶的完整鏈條:RxJS Observable.fromEvent鏈射擊爲每個用戶

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

第一個.do()中的console.log執行三次,因爲有三個訂戶。這不一定是個問題,但是隨着更多組件訂閱它,這樣看起來效率會很低。

有沒有一種方法可以只對每個事件執行一次鏈,然後將這些結果推送給所有訂閱者,然後執行他們想要的任何操作?

感謝

+0

您可以[發佈](http://reactivex.io/documentation/operators/publish.html)它。但請注意,您還需要[連接](http://reactivex.io/documentation/operators/connect.html)或[RefCount](http://reactivex.io/documentation/operators/refcount.html)。 –

+0

或者使用['share'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-share) – olsn

+0

不錯。 *這是.publish()的別名。refCount()* –

回答

2

是的,您可以使用share爲您的最後一個算:

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

這將基本上共享所有用戶之間的數據流。

注:sharepublish().refCount()一個別名 - 請參閱該文檔的詳細信息:publish