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

Angularjs RxJS从其他行为主体创建行为主体的正确方式?,angularjs,rxjs,observable,Angularjs,Rxjs,Observable,所以我在一个角度应用程序中使用了一个可观察的值,我想从其他行为主体派生出几个行为主体。我正在使用.map()运算符转换行为主题,但发现无法引用.value。我希望能够引用上次发出的当前值(因此通过映射函数传递)。通过对foo.map()的输出进行深入研究,我发现我可以获得我想要的功能: let foo = /* some BehaviourSubject */ let bar = foo.map((x) => x / 2) bar.operator.project(bar.destinat

所以我在一个角度应用程序中使用了一个可观察的值,我想从其他行为主体派生出几个行为主体。我正在使用.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)
函数上分发BehaviorSubject。我编写此包装器是为了处理以下事实:localStorage更改事件在所有选项卡上触发,但更改值的选项卡除外

我的应用程序的某些部分需要知道用户是否已初始化,或者该用户是否是匿名用户(某些Portlet可以在不登录的情况下访问)或者是否经过身份验证(对于那些需要用户登录的Portlet),以及这些状态何时更改。为了避免重复为isInitialized、isAnonymous和isAuthenticated生成布尔值的逻辑,我想从
auth.User$
派生更多的行为子对象。我特别希望它们是行为子对象,因为应用程序的某些部分只需要在调用的基础上使用值,因此能够引用
auth.isAuthenticated$.value
比订阅该可观察值更可取

我使用了
Observable.map()
函数,因为我想让可观察值在
auth.user$
执行时触发,并转换从中发出的值,但希望它仍然是上面提到的BehavorSubject


因此,我的问题本质上是:是否有一个标准约定,可以将转换/映射函数应用于行为主体,然后仍然获得行为主体?

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

当你做
let foo=/*某个行为主体*/let bar=foo.map((x)=>x/2)
,那么
bar
就不再是主体,它是一个可观察的对象,即价值流的生产者。您需要订阅
bar
,才能启动该制作者并实际获得一个值。您的API似乎正是这样做的。较短的方法是执行
bar.subscribe(另一个行为主题)


现在,你真的需要这么早开始制作吗?i、 首先,你真的需要一个行为主题吗?如果您这样做了,那么当然可以继续。

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