合并函数内部的RxJS映射函数

时间:2018-11-09 09:21:50

标签: javascript angular rxjs

我正在尝试合并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
    }
  })

有人可以在这里解释我在做什么错吗?

1 个答案:

答案 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将此信息作为元数据附加到用户信息响应中。然后,在最终操作员中,我们将获得用户信息以及触发信息,以帮助区分应采取的措施。