RxJS过滤多个流

RxJS filtering over multiple streams

本文关键字:过滤 RxJS      更新时间:2023-09-26

实际上我在这个问题上卡住了。

我有一个使用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"

的所有事件

这怎么可能?

提前感谢!

如果你想合并两个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

如果你想在所有可观察对象完成后发出一个单独的值,使用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]

这个答案已经过时了!遗憾的是,我不能删除它

像这样的东西对我很有用:

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;
        });

我订阅了我的事件可观察对象中的用户。之后,我将用户保存为事件的一个属性。

工作对我来说很好!

注意:如果你想实时更新你的用户,把可观察对象保存到属性中,而不是user对象中。<然后在稍后的视图中订阅它。>