javascript - 将两个不同类 rxjs 的两个不同可观察值分组

标签 javascript typescript rxjs

我有两个 Observables 发出 2 个不同类的数据:

1.用户类别:

{
"id"=>25,
"username"=>"Chris",
.. other data 
}

2.UserWebsocket类

 {
     "user_id"=>25,
     "age"=>25,
      .. other data 
  }

我想通过 user_id 或 id 属性合并和分组两个可观察量。这样合并分组类型的结果就是:

[User|undefined,UserWebsocket|undefined]

为了更好地说明问题,我做了一个简单的弹珠图:

enter image description here

这是怎么发生的?

最佳答案

正如马丁的评论建议使用combineLatest并为每个部分设置一个起始值。假设您有 myUser$myUserWebsocket$ observables,您可以使用以下代码将它们组合起来。首先添加一个起始值并将观测值存储在新的观测值中。使用combineLatest将它们组合起来。您必须订阅 uncoldcombined$ observable。

更新

另一种方法是使用 merge 并将其与 withLatestFrom 组合。

// Using RxJS v6+
import { merge } from 'rxjs';
import { startWith, map, withLatestFrom } from 'rxjs/operators';

// Your allready defined observables named e.g. myUser$ and myUserWebsocket$
// Add a starting value, since if user fires, websocket has no value yet.
const user$ = myUser$.pipe(
  startWith(undefined)
)
const userWebsocket$ = myUserWebsocket$.pipe(
  startWith(undefined)
)

const combined$ = merge(
  user$,
  userWebsocket$
).pipe(
  withLatestFrom(user$),
  withLatestFrom(userWebsocket$),
  map(([[merge, latestUser], latestWebsocket]) => {
    if (merge.user_id) { // merge is typeof userWebsocket, make sure user does not have user_id property
      if (latestUser && merge.user_id === latestUser.id) {
        return [latestUser, merge];
      } else {
        return [undefined, merge];
      }
    } else if (merge.id && !merge.user_id) { // merge is typeof user
      if (latestWebsocket && merge.id === latestWebsocket.user_id) {
        return [merge, latestWebsocket];
      } else {
        return [merge, undefined];
      }
    }
  })
);

combined$.subscribe([user, websocket] => {
  console.log(user, websocket);
});

关于javascript - 将两个不同类 rxjs 的两个不同可观察值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52871378/

相关文章:

javascript - 如何在extjs 4中制作不同颜色的柱形图

javascript - 需要用Angular制作父子菜单

unit-testing - 我可以在没有 TestScheduler 的情况下对 RxJS 函数进行单元测试吗?

angular - 如何订阅响应式(Reactive) FormGroup 并映射值变化( Angular 6)

javascript - 单击文档正文时隐藏 iPad 键盘

javascript - 为什么我在 Angular JS 中得到两个方法调用?

javascript - 不使用 <any> 的 typescript 和解决 promise

javascript - 在 Luxon 中像持续时间一样解析 ISO 8601

typescript - 确保对象包含动态键

javascript - 为什么一个 RxJS Subject 比多个事件监听器更快?