RxJS 过滤多个流
RxJS filtering over multiple streams
其实我卡在了这个问题
我有一个使用 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;
});
现在我想合并流以获得以下结果:
Return 我所有 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
如果你想在所有 Observables 完成后发出单个值使用 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;
});
我正在订阅可观察事件中的用户。之后,我将用户保存到我的活动的 属性。
工作对我来说很好!
注意:如果您想获得用户的实时更新,请将可观察对象保存到 属性 而不是用户对象。 <然后稍后在视图中订阅它。
其实我卡在了这个问题
我有一个使用 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;
});
现在我想合并流以获得以下结果:
Return 我所有 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
如果你想在所有 Observables 完成后发出单个值使用 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;
});
我正在订阅可观察事件中的用户。之后,我将用户保存到我的活动的 属性。
工作对我来说很好!
注意:如果您想获得用户的实时更新,请将可观察对象保存到 属性 而不是用户对象。 <然后稍后在视图中订阅它。