Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJS Observable.fromEvent链为每个订阅者触发_Javascript_Events_Rxjs_Observable - Fatal编程技术网

Javascript RxJS Observable.fromEvent链为每个订阅者触发

Javascript RxJS Observable.fromEvent链为每个订阅者触发,javascript,events,rxjs,observable,Javascript,Events,Rxjs,Observable,我为键盘驱动的界面制作了一个按键服务,我发现它似乎为每个订阅者执行完整的链: this.documentKeyEvent = Observable.fromEvent(document, 'keydown') .do((e: KeyboardEvent) => console.log(e.keyCode || e.which)) .filter((e: KeyboardEvent) => !isKeyModified(e) && !!Keys[remap(e.

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

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

是否有一种方法可以在每个事件中只执行一次该链,然后将这些结果推送到所有订阅者,然后对其执行任何操作

谢谢

是的,您可以作为最后一个操作员使用:

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();
这将基本上在所有订阅者之间共享流

注意:
share
publish().refCount()
的别名-有关详细信息,请参阅文档:

您可以使用它。但请注意,您还需要或。或使用Nice。这是.publish().refCount()的别名