【发布时间】:2021-09-29 14:23:43
【问题描述】:
RxJS 中有类似 flatTap 的东西吗?如果不是,为什么?这会是“坏习惯”吗?
假设您想点击某物并自动订阅(一个)内部可观察对象 - 与 flatMap 类似 - 但您希望保留相同的对象以进行进一步的管道传输。然后我看到自己有时会做这样的事情:
outerObservable.pipe(
flatMap(v => {
return createInnerObservables(v).pipe(
toArray(),
map(() => v),
);
}),
map(v => do something with v),
)...
使用 flatTap 运算符,这可以简化为:
outerObservable.pipe(
flatTap(v => createInnerObservables(v)),
map(v => do something with v),
)...
【问题讨论】:
-
谁会清理该订阅?我认为做
tap(v => createInnerObservables(v).subscribe())更明确,至少它清楚地表明有一个悬空订阅可能永远不会被清理。你可以创建这个运算符供自己使用,但我不会在 rxjs 中将其添加为官方的。 -
另一个问题是命名:
flatMap首先将值映射到 observable,然后将生成的 Observable> 展平为 Observable 。这与执行 map(v => observable)后跟mergeAll()基本相同。如果我们试图遵循这个逻辑,flatTap这个名字就没有意义 -
'会是“不好的做法”吗?'。基本上是的。我并不是说你从不想要这样做,但这已经足够一个危险信号了,你应该明确地订阅
tap。
标签: rxjs rxjs6 rxjs-pipeable-operators