繁体   English   中英

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

[英]RxJS Observable.fromEvent chain firing for each subscriber

我已经为键盘驱动的界面提供了关键服务,而且我发现它似乎可以为每个用户执行完整的链接:

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

有没有一种方法可以在每个事件中只执行一次该链,然后将这些结果推送给所有订阅者,然后随心所欲地做什么?

谢谢

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM