【问题标题】:RxJS map function inside of merge function合并函数内部的 RxJS 映射函数
【发布时间】:2018-11-09 09:21:49
【问题描述】:

我正在尝试合并 3 个不同的 observables 并将它们标识为源值。此外,我在 withLatestfrom 中获取了 userDetails,以便我可以根据触发的 observable 进行操作(用户名 - 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
    }
  })

谁能解释我在这里做错了什么?

【问题讨论】:

  • 你使用的是哪个版本的 Rxjs?你也在使用rxjs-compat 吗?我问的是因为你使用的是 Observable.merge.pipe,它们是来自两个不同版本的 Rxjs 的语法。
  • 我正在使用 rxjs 5。我想我应该不使用 Observable.merge 吗?我没有使用 rxjs-compat。
  • 如果您使用的是 Rxjs5,那么您应该无法使用 .pipe 我猜。您的运营商 (map) 将直接链接到 Observable 值本身。
  • 你能通过 Minimal StackBlitz 样本复制这个吗?
  • 奇怪,我以为是其他方式...如果我错了,请纠正我。 blog.hackages.io/rxjs-5-5-piping-all-the-things-9d469d1b3f44

标签: javascript angular rxjs


【解决方案1】:

请尝试将第一个混合(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;;
    })
})

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

编辑

由于上述代码,您的流应该是这样的:
每个发出 observable 结果的 onXXXUpdate 函数都使用 merge 运算符合并:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-merge
因为合并运算符返回单个可观察对象,该可观察对象能够发出它的“子”可观察对象发出的每种值类型,所以在下一个运算符concatMap 中,我们将每个发出的值(不管它的源)映射到作为@ 输出创建的新可观察对象987654329@(我假设这个函数返回 observable,不是吗?)。为了跟踪触发器是什么,我们通过map将此信息作为元数据附加到用户信息响应中。之后,在最终操作符中,我们将获得用户信息和触发信息,以帮助区分应采取的操作。

【讨论】:

  • 感谢您的努力。不幸的是,当我使用 observables 数组时,它们根本没有被触发,并且它永远不会到达 switch case 语句。
  • 哎呀,我的错,根据文档,这不应该是静态merge 中的数组。我修正了我的答案
  • 实际上我也设法让它与数组一起工作。显然有一个使用 ... 运算符的解决方法。类似的东西: Observable.merge(...[this.onUserNameUpdate().map(() => 'u'), this.onPasswordUpdate().map(() => 'p'), this.onAgeUpdate( ).map(() => 'a')]) 不幸的是,我仍然有与 OP 中相同的错误。
  • 我在发布问题之前就尝试了您的更新版本,它也有同样的问题。我总是得到“你”的回应。
  • 您是否尝试跳过此withLatestFrom 运算符?是的,... 运算符会将数组转换为它的实体,所以可能与其称其为 hack,不如说它是一种语法糖 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多