【发布时间】: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