2017-04-27 29 views
1

データベースから犬のリストを取得しようとしています。私はObservable<Dog[]>として犬のリストを取得したいと思います。しかし、私がtoArray()を呼び出したり、配列に入ってくるストリームを変換しようとする他のメソッドを使ったりすると、retrieveDogs(dogsId)メソッドを呼び出すときにデータを受け取らなくなります。 Observable streamの代わりにObservable arrayを取得するにはどうすればよいですか?ObservableストリームをObservable Arrayに変換する方法

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から配列にすべてのデータをバッファすることができます。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toarray.mdはあなたが望むものですか? –

+0

私はあなたがストリームについて何を意味するかを知る。私はtoArray()が、配列をカプセル化してオブザーバブルを返すために、いくつかの形式のcomplete()メソッドを起動する必要があることに気付きました。 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

関連する問題