RxJS Observable.fromEvent链为每个订户触发

时间:2017-03-15 18:47:55

标签: javascript events rxjs observable

我为键盘驱动的界面提供了关键服务,我发现它似乎为每个订阅者执行完整链:

gradle.bat

第一个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)); 中的console.log执行三次,因为有三个订阅者。这不一定是一个问题,但似乎随着更多组件订阅它会变得非常低效。

有没有办法只为每个事件执行一次该链,然后将这些结果推送给所有订阅者然后做他们想做的事情?

由于

1 个答案:

答案 0 :(得分: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