我正在尝试合并3个不同的可观察对象并将其标识为源值。我也在withLatestfrom中获取userDetails,以便我可以根据触发了哪个可观察对象(用户名-u,密码-p,年龄-a)进行操作。我确信我将地图函数放在Observable.merge里面是有问题的,这就是为什么无论哪个Observable都应该触发我的源代码,在“ switch case”语句中始终为'u'。>
@Effect
public test = Observable.merge(
this.onUserNameUpdate().pipe(
map(() => 'u')),
this.onPasswordUpdate().pipe(
map(() => 'p')),
this.onAgeUpdate().pipe(map(() => 'a')))
.withLatestFrom(this.store.select(getUserDetails),
(source, userDetails) => ({
source,
order
})
)
.map((params) => {
switch (params.source) {
case 'u':
// do smth with username
case 'p':
// do smth with password
case 'a':
// do smth with age
}
return {
// some object
}
})
有人可以在这里解释我在做什么错吗?
答案 0 :(得分:0)
请尝试用一些纯RxJS 5可观察变量数组替换混合的第一部分(this
和可观察的运算符):
map
然后查看您的开关/机壳是否在相应移动。
同样,我看到您正在获取其他用户详细信息,具体取决于可观察到的源触发操作,我将其包含在pipe
中:
public test = Observable
.merge(
this.onUserNameUpdate()
.map(v => 'u'),
this.onPasswordUpdate()
.map(v => 'p'),
this.onAgeUpdate()
.map(v => 'a')
)
最后,您获得了带有元数据的用户信息以及触发更改的原因
由于上述代码,您的流应如下所示:
结果中发出的每个concatMap
函数都使用.concatMap((trigger) => {
return this.store.select(getUserDetails)
.map(user => {
let ret = user;
ret.trigger = trigger;;
})
})
运算符进行合并:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-merge
由于合并运算符返回的单个可观察变量能够发出其“子”可观察变量正在发出的每个值类型,因此在下一个运算符onXXXUpdate
中,我们将发出的每个值(无论其来源如何)映射到作为输出创建的新可观察变量来自merge
(我假设此函数返回的值是可观察的,不是吗?)。为了跟踪触发器是什么,我们通过concatMap
将此信息作为元数据附加到用户信息响应中。然后,在最终操作员中,我们将获得用户信息以及触发信息,以帮助区分应采取的措施。