我现在有了这段代码来过滤一个可观察的。
listings$: Observable<Listing[]>;
this.listings$ = this.firestore
.getListings()
.pipe(map(listings => listings.filter(listing => listing.promoted === true)));
哪种方法很好,但我想充分利用rxjs而不是在数组上使用filter
。
this.firestore.getListings()
函数返回Observable<Listing[]>
,this.listings$
也必须为Observable<Listing[]>
。
我尝试了不同的方法,并在此期间挣扎了一段时间。也许你可以帮助我。我还是#34;新鲜&#34;角度和rxjs。
this.listings$ = this.firestore.getListings().pipe(
mergeMap(listings => listings),
filter(listing => listing.promoted === true)
);
类型
Observable<Listing>
不能分配给Observable<Listing[]>
类型。
我可能在使用mergeMap
运算符时出错了,或者在这种情况下使用它也不正确。
我尝试从this帖子调整代码。 flatMap
运算符似乎已更改为mergeMap
。但它仍然无效。
答案 0 :(得分:0)
嗯,这取决于您希望如何使用this.listings$
Observable。使用mergeMap(listings => listings)
是正确的,它会将Observable<Listing[]>
变为Observable<Listing>
,但您说要使用RxJS filter()
运算符,并且您希望最后有Observable<Listing[]>
一种方法是使用take(1)
和toArray()
运算符。 toArray()
会将来自其来源的所有排放物累积到一个阵列中,当源竞争时,它会发出阵列。
this.listings$ = this.firestore.getListings().pipe(
take(1),
mergeMap(listings => listings),
filter(listing => listing.promoted === true),
toArray(),
);
请注意,此listings$
Observable只会发出一次,并且不会对来自this.firestore.getListings()
的任何后续排放作出反应。
就个人而言,我实际上使用的是pipe(map(listings => listings.filter(...)))
,因为这样更容易使用。