2017-04-27 241 views
1

我想從數據庫中檢索狗的列表。我想要檢索狗列表作爲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) 
    } 
+0

小故事,你不這樣做,觀測的事件流。您可以使用toArray將src observable中的所有數據緩衝到數組中。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toarray.md是你想要的嗎? –

+0

我明白你的意思。我注意到toArray()需要某種形式的complete()方法才能被封裝數組並返回observable。不幸的是,AngularFire方法不會觸發任何完整的方法,因此toArray()只是等待,因此沒有返回。 – martinomburajr

回答

0

你可以做到這一點,以檢索數據:

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

簡單的演示這裏http://jsbin.com/sotunopocu/2/edit?js,console