【问题标题】:Is there something like flatTap in RxJSRxJS 中是否有类似 flatTap 的东西
【发布时间】: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


【解决方案1】:

您也许可以使用subject 来设置副作用

let doSideEffect=new Subject();
outerObservable.pipe(
  tap(v => doSideEffect.next(v)),
  map(v => do something with v),
)...
// you can handle when to unsubscribe/complete the stream
doSideEffect.asObservable().pipe(....)

【讨论】:

    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多