RxJS从其他行为主体创建行为主体的正确方法?

时间:2017-05-16 19:58:31

标签: angularjs rxjs observable

所以我在角度应用程序中使用了一个可观察的值,并且我希望从其他行为主题中创建几个行为主题。我正在使用.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的标准约定?

1 个答案:

答案 0 :(得分:0)

我不确定我理解你的问题,但基本上一个行为主题总是有一个值,所以你可以在任何时间点从该值查询主题。我相信Rxjs v5,getValue是相关的方法。

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

现在,你真的需要这么早就开始制作人吗?即你真的需要一个行为主体吗?如果你这样做,那么当然要继续。