如何将2个FirebaseListObservable合并为一个observable

时间:2017-07-07 13:35:25

标签: angular typescript firebase-realtime-database rxjs ionic3

我有2个Firebase列表:

  • 包含4个项目的publicItems
  • 包含2个项目的privateItems

我想从这两个列表中提取并将它们组合成一个可观察的列表。

为此,我尝试使用 merge

import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/merge';

items: Observable<any[]>;
this.items = this.af.list('/privateItems').merge(this.af.list('/publicItems'));

然后在视图中:

<ul>
   <li *ngFor="let item of items | async">item.title</li>
</ul>

然而,这具有仅显示4个公共项目的效果。

合并是否适用于此?我如何将2个FirebaseListObservable合并为1个可以一起显示的Observable?

2 个答案:

答案 0 :(得分:2)

试试这个

this.items = Observable.combineLatest(
    this.af.list('/privateItems'),
    this.af.‌​list('/publicItems'),
    (privateItems, publicItems)=> {
      console.log(privateItems); 
      console.log(publicItems); 
      return [...privateItems, ...publicItems]
    }
);

OR

this.items = this.af.list('/privateItems')
   .flatMap(privateItems=> this.af.list('/publicitems')
        .map(publicItems=> [...privateItems, ...publicItems])
   );

更新

我得到了你案件中发生的事情。你得到了两个回复:

-----[privateItems] -------- [publicItems]----- 

因此this.items获取第一个响应值,然后它将覆盖第二个响应值。但是根据您的要求,您需要将它们放在一起,因此使用reduce可能会有所帮助。

this.items = this.af.list('/privateItems')
       .merge(this.af.list('/publicItems'))
       .reduce((total,current)=>[...total,...current],[]);

答案 1 :(得分:1)

很抱歉复活旧帖子,但这是我的组合可变数量的FirebaseListObservables的解决方案:

let rooms = ['room1', 'room2', 'room3'];
let observables = rooms.map((room) => { return this.cs.getMessagesByRoomId(room) });

this.messages = Observable.combineLatest(
  observables,
  (...rooms) => {
    console.log('rooms',Array.prototype.concat(...rooms));
    return Array.prototype.concat(...rooms)
  }
);