RxJS过滤多个流

时间:2016-10-09 08:16:54

标签: javascript angular rxjs observable angularfire2

实际上我遇到了这个问题。

我有一个使用Angularfire2的事件流。



this.events$ = this.af.database.list('/events')
    .map(events => {
    const filtered = events.filter(event => event.title === "Title 1");
    return filtered;
    });




检索我这样的数据:



{
  title: "Title 1",
  userid: "1"  
}




然后我为用户提供了第二个流:



this.users$ = this.af.database.list('/users/1')
    .map(users => {
    const filtered = users.filter(user => user.name === "Name 1");
        return filtered;
    });




现在我想组合流来获得以下结果:

event.title === "Title 1"user.name === "Name 1"

中的所有事件归还给我

这怎么可能?

提前致谢!

2 个答案:

答案 0 :(得分:0)

如果要合并两个Observable,请使用merge()

查看现场演示:http://plnkr.co/edit/7j71Qzok7CoFVt49QBs4

import {Observable, Subject} from 'rxjs';

let stream1 = new Subject();
let stream2 = new Subject();

Observable.merge(stream1, stream2)
  .subscribe(r => {
    console.log(r);
  });

stream1.next(43);
stream2.next(42);
stream1.next(41);

打印到控制台:

43
42
41

如果要在所有Observable完成后使用forkJoin()发出单个值:

import {Observable, Subject} from 'rxjs';

let stream1 = new Subject();
let stream2 = new Subject();

Observable.forkJoin(stream1, stream2)
  .subscribe(r => {
    console.log(r);
  });

stream1.next(43);
stream2.next(42);
stream1.next(41);

stream1.complete();
stream2.complete();

打印到控制台:

[41, 42]

答案 1 :(得分:0)

这样的事情对我有用:

this.events$ = this.af.database.list('/events')
      .map(events => {
        events.map(event => {
            this.af.database.object('users/' + event.userid)

            .subscribe(user => {
                event.user = user;
              })
            })

            const filtered = events.filter(event => event.title === "Test 1")
                .filter(event => event.user.name === "Name 1");;
                return filtered;
        });

我订阅了我的Event observable中的用户。之后,我将用户保存到我的活动的属性中。

对我来说工作很好!

注意:如果要获取用户的实时更新,请将observable保存到属性而不是用户对象。