merge函数内部的RxJS映射函数



我正在尝试合并3个不同的可观测值,并将它们标识为源值。此外,我还在LatestFrom中获取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
}
})

有人能解释一下我在这里做错了什么吗?

请尝试将第一个混合(pipe和可观测算子(部分替换为一些纯RxJS 5可观测数组:

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;;
})
})

最后,你得到了带有元数据的用户信息,以及触发变化的原因

编辑

由于上面的代码,您的流应该是这样的:
每个发出可观察结果的onXXXUpdate函数都使用merge运算符合并:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#静态方法merge
因为merge运算符返回单个可观测值,该可观测值能够发出其"子"可观测值正在发出的每一个值类型,所以在下一个运算符concatMap中,我们将发出的每个值(无论其来源如何(映射到作为this.store.select(getUserDetails)输出创建的新可观测值(我假设此函数返回可观测值是不是?(。为了跟踪触发器是什么,我们通过map将这些信息作为元数据附加到用户信息响应中。之后,在最终的操作员中,我们将有用户信息和触发信息,以帮助区分应采取的行动。

最新更新