【问题标题】:RxJS proper way of Creating Behavior Subjects from other Behavior Subjects?RxJS 从其他行为主体创建行为主体的正确方法?
【发布时间】:2017-05-17 20:16:17
【问题描述】:

所以我在一个角度应用程序中使用了一个可观察的值,我想从其他行为主体中派生几个行为主体。我正在使用 .map() 运算符转换我的行为主题,但发现我无法引用 .value。我希望能够引用上次发出的当前值(因此通过映射函数传递)。稍微挖掘一下 foo.map() 的输出,我发现我可以得到我想要的功能:

let foo = /* some BehaviourSubject */
let bar = foo.map((x) => x / 2)
bar.operator.project(bar.destination.value) // to get the value as last emitted

但那不是很好看

目前我正在做一些看起来像这样的事情来获得我想要的功能:

foo = /* some observable*/
bar = foo.map((x) => x / 2).toBehaviorSubject()
foobar = bar.map((y) => y > 10).toBehaviorSubject()

toBehaviorSubject() 是我定义如下的函数

rx.Observable.prototype.toBehaviorSubject = function (initialValue) {
initialValue = initialValue || null
let subject$ = new rx.BehaviorSubject(initialValue)
this.subscribe((value) => { subject$.next(value) })
return subject$
}

我之前曾尝试过将此作为解决方案,但选择了我上面展示的内容:

foo = /* some BehaviourSubject */
bar = new rx.BehaviorSubject( foo.value / 2))
foo.subscribe( (x) => {
   bar.next(x / 2)
})
foobar = new rx.BehaviorSubject(bar.value > 10)
bar.subscribe( (y) => {
   foobar.next(y > 10)
})

这些都有效,但我不得不问,是否有标准约定可以像上面两个示例一样有效?

编辑-------

添加一些上下文可能会有所帮助。

所以我有一个 BehaviorSubject auth.User$,它来自我为 window.localstorage 访问编写的服务,该服务在其 localStorage.get(key) 函数上分发 BehaviorSubjects。我编写了这个包装器来处理 localStorage 更改事件在除更改值的选项卡之外的所有选项卡上触发的事实。

我的应用程序的某些部分需要知道用户是否已初始化,或者用户是否是匿名用户(某些 portlet 无需登录即可访问)或已验证(对于那些需要用户登录的用户) ,以及这些状态何时发生变化。为了避免重复为 isInitialized、isAnonymous 和 isAuthenticated 生成布尔值的逻辑,我想从 auth.User$ 派生更多的 BehaviorSubjects。我希望它们成为 BehaviorSubjects,特别是因为应用程序的某些部分只需要 on-call 的值,因此能够引用 auth.isAuthenticated$.value 比订阅那个 observable 更可取。

我使用了Observable.map() 函数,因为我希望拥有在auth.user$ 执行时触发的可观察值,并转换从它发出的值,但希望它仍然是如上所述的 BehavorSubject。

所以我的问题本质上是:是否有将转换/映射函数应用于 BehaviorSubject 并仍然获得 BehaviorSubject 的标准约定?

【问题讨论】:

  • 您要解决的实际问题是什么?为什么要将价值观推入第二个主题?你能把两个来源结合起来吗?
  • 我正在使用它来处理跨标签的用户身份验证。原始 observable 是一个行为主体,它从 $window.localStorage 变量中获取下一个值,并且在身份验证服务中,我想为用户创建初始化、匿名和身份验证状态的行为主体,以处理登录和注销以及一些 portlet无需登录即可查看。然后在某些情况下订阅这些内容,并在其他地方使用auth.isAnonymous.value(等)引用。
  • 您能edit 为问题添加一些上下文吗?我认为您可能试图解决错误的问题。

标签: angularjs rxjs observable


【解决方案1】:

我不确定我是否理解您的问题,但基本上行为主题总是有一个值,因此您可以随时从该值查询该主题。我相信在 Rxjs v5 中,getValue 是相关的方法。

当您执行let foo = /* some BehaviourSubject */ let bar = foo.map((x) => x / 2) 时,bar 不再是主题,而是可观察的,即值流的生产者。您需要订阅bar 才能启动该生产者并实际获得一个值。您的 API 似乎就是这样做的。更短的方法是bar.subscribe(anotherBehaviourSubject)

现在,你真的需要这么早开始制作人吗?即,您实际上是否首先需要行为主题?如果你这样做了,那么当然要继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-03-20
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多