【问题标题】:Why does piping a BehaviorSubject create an AnonymousSubject in RxJS?为什么管道 BehaviorSubject 会在 RxJS 中创建 AnonymousSubject?
【发布时间】:2018-10-04 05:04:58
【问题描述】:

在创建 RxJS BehaviorSubject 时,它会一直保持为 BehaviorSubject,直到它变为 pipe'd。只要返回 pipe'd 版本,它就会变成 AnonymousSubject

示例:

// Instance of `BehaviorSubject`
const behaviorSubject$ = new BehaviorSubject({ someValue: null })

// Suddenly becomes an Anonymous Subject
const anonymousSubject$ = (
    behaviorSubject$
    .pipe(
        pluck('someValue')
    )
)

// Also suddenly becomes an Anonymous Subject
const anonymousSubject$ = (
    new BehaviorSubject({ someValue: null })
    .pipe(
        pluck('someValue')
    )
)

ReplaySubject 也遇到了同样的问题。我似乎无法通过主题管道并返回该主题。它始终转换为AnonymousSubject。我认为我在这里寻找的是类似于 Promise 的行为,我可以从任何地方订阅这个 observable 并获取传递给它的一个值。

【问题讨论】:

  • 你有关心的代码吗?如果你这样做,你不应该这样做。
  • 我需要做behaviorSubject$.value。我应该改用ReplaySubject 吗?
  • 你需要传递一个参数给 BehaviorSubject()
  • IMO 使用value 是一种代码味道,即使lift 返回了BehaviorSubject,如果解除的主题是,你会期望value 是什么?原始价值还是采摘价值?我认为你应该认真重新考虑使用value
  • BehaviorSubject 允许你做subject.valueAnonymousSubject 做不到。

标签: javascript rxjs rxjs5 behaviorsubject subject-observer


【解决方案1】:

这是因为lift 调用了Subject

让我们更深入地看看你的例子:

  1. 您正在实例化一个 BehaviorSubject,它扩展 Subject
  2. 您正在调用 pluck 运算符,internally 调用 map运营商
  3. map 操作员 internallyBehaviorSubject 上调用 liftSubject 然后返回 AnonymousSubject

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多