rxjs - [Rxjs]如何在Rxjs中对多个同步事件进行分组,只触发一次订阅者?
问题描述
我有菱形流依赖和单个事件转换为多个然后合并为一个,但触发多次。
我想将它们分组为单个输出。
我找到了一个解决方案,但我不确定这是正确的方法还是反模式。
如果我的解决方案可能很脏,那么推荐的方法是什么?
原来的
const obs1 = new Subject<number>();
const obs2 = obs1.pipe(map(v => v + 1));
const obs3 = obs1.pipe(map(v => v * 2));
const obs4 = combineLatest(obs1, obs2, obs3);
obs4.subscribe(console.log);
interval(2000)
.pipe(take(3))
.subscribe(obs1);
输出:
(3) [0, 1, 0]
(3) [1, 1, 0]
(3) [1, 2, 0]
(3) [1, 2, 2]
(3) [2, 2, 2]
(3) [2, 3, 2]
(3) [2, 3, 4]
我的解决方案
const obs1 = new Subject<number>();
const obs2 = obs1.pipe(map(v => v + 1));
const obs3 = obs1.pipe(map(v => v * 2));
const obs4 = combineLatest(obs1, obs2, obs3).pipe(
switchMap(v => of(v, asapScheduler)),
);
obs4.subscribe(console.log);
interval(2000)
.pipe(take(3))
.subscribe(obs1);
输出(也预期):
(3) [0, 1, 0]
(3) [1, 2, 2]
(3) [2, 3, 4]
解决方案
如果您只是在转换输入值,为什么不做类似的事情
interval(2000)
.pipe(
take(3),
map(val => ([val, val + 1, val * 2])),
)
.subscribe(array => console.log(array));
还是您的真实数据源不仅仅是转换?
或者,如果您需要所有三个来源并想要组合最新值,withLatestFrom
这可能是一个不错的选择,这也会产生您预期的输出:
const obs1 = new Subject<number>();
const obs2 = obs1.pipe(map(v => v + 1));
const obs3 = obs1.pipe(map(v => v * 2));
const obs4 = obs1.pipe(
withLatestFrom(obs2, obs3)
);
obs4.subscribe(console.log);
interval(2000)
.pipe(take(3))
.subscribe(obs1);
推荐阅读
- javascript - 无法在函数中获取 Usestate 的值
- javascript - 带有 SignalR 服务的 Azure 函数 CORS 配置不起作用
- python - 为什么 matplotlib 不在此灰度图像中绘制所有黑线?
- ios - Swift 协议 Getter 和 Setter
- python - 在类中使用 namedtuple
- react-native - 无法在 Expo Camera recordAsync 上设置“质量”
- mobile-robot-toolkit - .simplemap 到 octomap/点云和地面实况机器人位姿转换
- android - 保证金不适用于视图 API 22
- vba - 使用 Word 宏/VBA 将表格从一个 Word 文档复制到另一个 Word 文档
- c# - 如何将 API 的 Body 参数传入 C#