如何将可观察流转换为可观察数组
问题描述:
我想从数据库中检索狗的列表。我想要检索狗列表作为Observable<Dog[]>
。但是,当我调用toArray()或使用任何其他方法尝试将传入流转换为数组时,我调用retrieveDogs(dogsId)
方法时不会收到任何数据。人们如何去取回Observable array
而不是仅仅是Observable stream
?如何将可观察流转换为可观察数组
retrieveDogs(dogIds : Array<string>): Observable<Dog[]>{
return Observable.from(dogIds)
.map(dogId => this.retrieveDog(dogId))
.flatMap(dogObservable => dogObservable)
.toArray();
}
retrieveDog(dogId : string) : Observable<DogEntity> {
//afDB -> AngularFireDatabase that returns an observable with the data from the firebase database
return this.afDB.object(DB_DOGS + DB_DASH + dogId)
.map(dogObject =>DogEntity.convertObject(dogId,dogObject)
}
答
你可以做到这一点,以检索数据:
retrieveDogs(dogIds : Array<string>): Observable<Dog[]>{
let obs = dogIds.map(dogId => this.retrieveDog(dogId));
return Observable.forkJoin(obs);
}
retrieveDog(dogId : string) : Observable<DogEntity> {
return this.afDB.object(DB_DOGS + DB_DASH + dogId)
.map(dogObject => DogEntity.convertObject(dogId,dogObject));
}
小故事,你不这样做,观测的事件流。您可以使用toArray将src observable中的所有数据缓冲到数组中。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toarray.md是你想要的吗? –
我明白你的意思。我注意到toArray()需要某种形式的complete()方法才能被封装数组并返回observable。不幸的是,AngularFire方法不会触发任何完整的方法,因此toArray()只是等待,因此没有返回。 – martinomburajr