-1

Ich versuche, eine Verknüpfung in Firebase zu erstellen.Flatten Observable <Observable <Object[]>>

So bekomme ich asynchron Array von IDs aus der db, und für jede ID lade ich dann asynchron das eigentliche Objekt. Und die Funktion soll Observable zurückgeben

Also, mit der ersten Async-Anfrage bekomme ich die Observable (String ist die ID). Also, was auch immer ich hier versuchte, ich bekomme entweder Observable oder andere Sachen, die ich nicht bekommen möchte.

Der Code:

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

Und der Fehler ist:

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

+0

Können Sie Ihren Code in die Frage aufnehmen? – cartant

+0

Aktualisiert mit dem Code –

+0

Sie müssten den Code für "Citation" einfügen. Ist das eine Schnittstelle oder eine Klasse? Wenn es sich um eine Klasse handelt, müssen Sie zumindest angeben, welche Parameter der Konstruktor verwendet. – cartant

Antwort

3

Sie forkJoin verwenden können, eine Reihe von Zitaten zu erhalten. Beachten Sie, dass die first Operator verwendet wird, um den aktuellen Wert von den object Observable zu erhalten, wie forkJoin die Observablen erfordert komplette:

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 ein Array von Observablen nimmt ab und gibt einen beobachtbaren, der ein Array der Observablen des emittiert endgültige Werte.

Wenn Sie Citation Instanzen zurückgeben, müssten Sie sie erstellen (vermutlich mit den Werten aus der Datenbank). Sie könnten dazu den Operator map verwenden:

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

Perfekt! Vielen Dank. Funktioniert wie erwartet –

Verwandte Themen