-1

Firebaseで結合を作成しようとしています。Flatten Observable <Observable <Object[]>>

私はdbからidの配列を非同期的に取得し、idごとに非同期に実際のオブジェクトをロードします。関数はObservableを返します。

したがって、最初の非同期要求でObservable(文字列はIDです)が取得されます。 私がここで試したものは、Observableや他のものを手に入れています。

コード:

getUserFavourites(userId = ""):Observable<any[]> { 
    return this.af.database.list('/ranks_by_user/likes/'+userId, { 
    query: { 
     orderByKey: true, 
     limitToFirst: 50 
    } 
    }).flatMap((likes:any[]) => { 
    return like.map(like => { 
     return this.af.database.object("/citations/" + like.$key) 
    }); 
    }); 
} 

し、エラーがある:

Type 'Observable<FirebaseObjectObservable<any>>' is not assignable to type 'Observable<any[]>'.

+0

問題にコードを含めることはできますか?map演算子 – cartant

+0

コード –

+0

で更新されました。「引用」のコードを含める必要があります。インターフェイスかクラスですか?クラスの場合は、コンストラクタがどのようなパラメータを取るかを指定する必要があります。 – cartant

答えて

3

あなたが引用の配列を取得するためにforkJoinを使用することができます。

import { Observable } from "rxjs/Observable"; 
import "rxjs/add/observable/forkJoin"; 
import "rxjs/add/operator/first"; 
import "rxjs/add/operator/switchMap"; 

getUserFavourites(userId): Observable<any[]> { 
    return this.af.database.list('/ranks_by_user/likes/' + userId, { 
    query: { 
     orderByKey: true, 
     limitToFirst: 50 
    } 
    }) 
    .switchMap((likes: any[]) => Observable.forkJoin(
    likes.map(like => this.af.database.object("/citations/" + like.$key).first()) 
)); 
} 

forkJoinは観測の配列を取得し、観察者の最終的な配列を発する観察を返す:forkJoinが完了するまでに観測を必要とする、firstオペレータはobject観測から電流値を取得するために使用されることに注意してください値。

Citationインスタンスを返す場合は、インスタンスを作成する必要があります(おそらくデータベースの値を使用します)。

import "rxjs/add/operator/map"; 
... 
likes.map(like => this.af.database.object("/citations/" + like.$key).first().map(value => new Citation(value))) 
... 
+0

完璧!ありがとうございました。期待どおりに動作する –

関連する問題