rxjs - 管道 Observable 到 Subject 不会让它不必要地变热
问题描述
这个问题建立在这个问题的基础上,它展示了如何将一个Observable
输入到一个Subject
. Observable
我的问题类似,但除非必要,否则我想避免过热,以免.pipe()
不必要地运行。例如:
const subject$ = new Subject();
const mouseMove$ = Observable.fromEvent(document, 'mousemove')
.pipe(map(it => superExpensiveComputation(it)));
mouseMove$.subscribe(n => subject$.next(n));
由于订阅,这会变得mouseMove$
很热,并且superExpensiveComputation
会在每次鼠标移动时运行,无论是否有人在监听它subject$
。
如何在没有不必要运行的情况下mouseMove$
输入 into的结果?subject$
superExpensiveComputation
解决方案
您可以简单地使用tap
而不是subscribe
将排放传递给您的主题:
const mouseMove$ = fromEvent(document, 'mousemove').pipe(
map(it => superExpensiveComputation(it)),
tap(subject$)
);
当然,您仍然需要订阅以mouseMove$
使数据流动,但您不需要专门用于将数据传递给您的主题的订阅。
但是,您可能需要添加share
,以免为多个订阅者重复昂贵的逻辑。
const mouseMove$ = fromEvent(document, 'mousemove').pipe(
map(it => superExpensiveComputation(it)),
share(),
tap(subject$)
);
但是......那么在那种情况下,你真的需要一个主题吗?除非你打算.next()
从其他地方打电话,否则你可能不会。
推荐阅读
- vue.js - vue项目部署到tomcat,无法发送ajax请求显示404
- ios - HTTP 加载失败(错误代码:-1200 [3:-9802])
- java - 带有 Morphia 配置的 Spring Boot:BeanCreationException
- ravendb - Ravendb 尝试查询子对象导致“无法索引未索引字段”
- angular - Primeng 组件不使用 ngx-translate 更新翻译
- javascript - 使用 0.01 - 0.05 之间的不同随机数自动重复增加值
- mysql - Case 语句变量声明和在 MS SQL SERVER 中的使用
- php - 拉拉维尔 5.6。将状态附加到队列工作者
- tabs - PhpStorm - 关闭调试时打开的选项卡
- can-bus - candump如何显示发送、接收和时间戳