javascript - 在 RxJS 中,为什么每个订阅都会执行一次管道?

标签 javascript rxjs reactive-programming

我想要多个订阅来响应一个可观察的事件,但我也想记录该事件,所以我通过一个 do() 运算符将其通过管道传输,我在其中进行日志记录。

问题是,我创建的每个订阅都会记录一次事件!

我现在通过创建一个 Subject 并从事件回调中调用 next 来解决这个问题,这允许我记录一次事件并触发还有多个订阅。

下面是一些演示问题的代码:https://stackblitz.com/edit/rxjs-xerurd

我觉得我错过了什么,难道没有更“RxJS”的方法吗?

编辑:

我并不是要区分冷热可观察对象,事实上我使用的是热可观察对象——由 fromEvent() 创建的那个表现得好像很冷。

我现在意识到 - 在阅读 share() 之后 - pipe()“转变”了你可观察到的寒冷,即根据你的来源返回一个寒冷的(它可能冷,可能热)

最佳答案

因为默认情况下 Observable 序列是冷的,每个订阅将有一组单独的站点效果。

如果您希望您的副作用只执行一次 - 您可以通过向多个订阅者广播单个订阅来共享订阅。为此,您可以使用 shareshareReplay

为了更好地理解它是如何工作的,什么是“冷”和发布,请参阅 RxJS v4 文档:

4.8 Use the publish operator to share side-effects

关于javascript - 在 RxJS 中,为什么每个订阅都会执行一次管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52874725/

相关文章:

angular - RXJS Observable 将数组转换为多个值

haskell - `valueB` 是如何工作的?它总是返回相同的值?

javascript - 如何减少重复行?

javascript - 将 document.write 同步更改为异步的内容?

javascript - 如何在不需要播放的情况下对 chrome 中的音频文件进行 FFT 分析?

rxjs - 为什么没有 onComplete() rxjs 运算符?

javascript - 使用 jquery 按属性删除 html 元素

angular - 通过重定向登录后,Firebase Datasnapshot Observable 未立即更新

javascript - 更智能的缓冲器

javascript - Node.js Streams 与 Observables