我有2个可观察到的东西,它们是来自Firebase的angularfire并使用rxjs
private boatsCollection: AngularFirestoreCollection<Boat>;
boats: Observable<Boat[]>;
private bookingsCollection: AngularFirestoreCollection<Booking>;
bookings: Observable<Booking[]>;
结构没有前进,但是bookings
收集文档中的ID'S
包含有关boat
的信息(因此船id
)
我要过滤船,只保留id 与{1}}值不匹配的这些文档。
如何使用rxjs做到这一点?
ID
答案 0 :(得分:1)
有多种方法可以做到这一点。一种方法是使用RxJS combineLatest
函数同时从两个可观察对象获取通知,并使用Array filter
和includes
函数对数组进行过滤。
尝试以下
ngOnInit() {
combineLatest(this.boats, this.bookings).subscribe(
([boats, bookings]) => {
const bookingIds = bookings.map(booking => booking.id);
this.filteredBoats = boats.filter(boat => !(bookingIds.includes(boat.id)));
console.log(this.filteredBoats); // <-- correct
},
error => { }
);
console.log(this.filteredBoats); // <-- wrong - will print undefined/previous value
}
现在combineLatest
将针对其源可观察物的每次发射而发射。同样,所有源可观察物至少应发出一次。
您可以根据需要使用RxJS zip
或forkJoin
函数。尽管请记住,forkJoin
仅在所有源可观测值完成时才会发出。
filteredBoats
是异步分配的。这意味着到console.log
在订阅之外执行时,filteredBoats
还没有任何值。 console.log
应该在订阅中。
有关异步数据here的更多信息。