【问题标题】:How to merge a series of observables within observables如何在可观察对象中合并一系列可观察对象
【发布时间】:2017-05-09 22:44:35
【问题描述】:

我正在尝试重构我不久前编写的一些代码,以合并我所有的可观察对象以同时接收聊天对象。我正在使用角度和离子和火力。

 this.userAsync = this.chatsProvider.getMyUserChatsGrpID().mergeMap(grpIDs=> {
  if (grpIDs.length > 0) {

    return Observable.combineLatest(
      grpIDs.map((grpID) => this.chatsProvider.getGroupObjectAsync(grpID.$key).map(grpObject => {
          grpObject.object = grpObject;
          grpObject.memberProfiles = this.chatsProvider.getMemberProfiles(Object.keys(grpObject.members))
          grpObject.latestMessage = this.chatsProvider.getLatestConversation(grpID.$key, grpObject.lastChecked)
          grpObject.unreadMessages = this.chatsProvider.getUnreadMessageCount(grpID.$key, this.profileService.getUIDString())
        return grpObject
      })),
    )
  } else {
    return Observable.of([])
  }

目前此类代码将返回所需的对象,但是,grpObject.memberprofiles、.lastestMessage、.unreadMessages 作为可观察对象返回,然后我必须使用异步管道对其进行解包。有没有办法将其全部转换为可观察的项目?

【问题讨论】:

    标签: angular firebase ionic-framework rxjs observable


    【解决方案1】:

    如果我已经理解您想要正确实现的目标,即所有组数据(memberProfiles 等)未包装的组的可观察组,我认为您需要添加另一个 combineLatest,然后将三个可观察组放在那里。

    所以在 grpIDs.map 循环中你会想要这个

    return this.chatsProvider.getGroupObjectAsync(grpID.$key).combineLatest(
      this.chatsProvider.getMemberProfiles(Object.keys(grpObject.members)),
      this.chatsProvider.getLatestConversation(grpID.$key, grpObject.lastChecked),
      this.chatsProvider.getUnreadMessageCount(grpID.$key, this.profileService.getUIDString()),
      /* Function which gets passed all the latest observable values for you to merge together*/
      (group, members, latestConversation, unreadMessageCount) => {
        return { group, members, latestConversation, unreadMessageCount };
      }
    )
    

    请注意,我已经更改了对象属性。

    希望有帮助

    【讨论】:

      【解决方案2】:

      使用 toArray() 运算符。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-toArray

      let obs1$= Rx.Observable.of(1,2,3);
      let obs2$= Rx.Observable.of('A','B','C');
      
      obs2$.concat(obs1$).toArray().subscribe(x=>console.log(x))
      

      【讨论】:

      • 但是我仍然需要我的 grpID.$key 来生成其余的 observables
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2020-01-01
      • 1970-01-01
      相关资源
      最近更新 更多