我为键盘驱动的界面提供了关键服务,我发现它似乎为每个订阅者执行完整链:
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
执行三次,因为有三个订阅者。这不一定是一个问题,但似乎随着更多组件订阅它会变得非常低效。
有没有办法只为每个事件执行一次该链,然后将这些结果推送给所有订阅者然后做他们想做的事情?
由于
答案 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();
这将基本上在所有订阅者之间共享流。
注意:share
是publish().refCount()
的别名 - 有关详细信息,请参阅文档:publish