【问题标题】:RxJS Observable.fromEvent chain firing for each subscriber为每个订阅者触发 RxJS Observable.fromEvent 链
【发布时间】:2017-03-15 18:47:55
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 你可以publish它。但请注意,您还需要ConnectRefCount
  • 或使用share
  • 不错。 这是 .publish().refCount() 的别名

标签: javascript events rxjs observable


【解决方案1】:

是的,您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多