2017-01-28 1 views
1

Ich arbeite an einem Projekt mit Angular2 und versuche, viele der hoch dynamischen Benutzeroberfläche mit RxJS-Funktionalität (und Firebase als Back-End) zu bauen.Das Zurückgeben einer Observablen mit switchMap aus dem Dienst gibt es in Array zurück

Nun nehmen Sie das folgende Szenario:

this.af.auth 
    .filter(Boolean) 
    .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid)); 

Dies wird überprüfen, ob der Benutzer ordnungsgemäß angemeldet ist und wenn ja, auf die inneren beobachtbaren wechseln, um die gespeicherten Benutzerinformationen (zB Admin-Eigenschaft zu erhalten usw.)

Dies funktioniert gut (mit sowohl subscribe() und mit asynchronen Rohr in der Vorlage).

Was mich verwirrt ist, dass, wenn ich versuchte, das Observable zu einem dedizierten Dienst zu bewegen und es abzurufen, es das Observable "Wrapped" in einem Array zurückgeben wird.

// in original component 
let userObservable = this.databaseSrv.getUserObservable(); // the userObservable will be wrapped as an Array and the component logic breaks 

// in database-service 
getUserObservable(){ 
    return this.af.auth 
    .filter(Boolean) 
    .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid)); 
} 

Ich habe versucht, verschiedene Varianten mit Karte/flatmap/merge ... es ist sicherlich etwas falsch mit der Art, wie ich die beobachtbare zurückkehren, aber ich kann meinen Kopf nicht scheinen, um es zu wickeln.

Jede Erläuterung dieses Verhaltens wird sehr geschätzt.

Antwort

1

Versuchen userObservable als Objekt deklariert, statt nur let userObservable erklärt. Arrays sind tatsächlich Objekte, also könnte dies etwas damit zu tun haben, dass Ihr Objekt als Array endet.

So versuchen:

userObservable:Object = {}; 
this.userObservable = this.databaseSrv.getUserObservable(); 
+0

Danke für Sie helfen Sie! funktionierte nicht ganz so, wie du es beschrieben hast, aber es hat mich auf den richtigen Weg gebracht. Siehe unten meine Antwort. Nochmals vielen Dank. Leider kann ich dich noch nicht auf den neuesten Stand bringen :-( – jparg

+0

Kein Problem, froh, dass ich dich rechts habe mindestens verfolgen: D – Alex

1

Okay, mit mir AJT_82 Hilfe jetzt die richtige Antwort.

getUserObservable(){ 
    return this.af.auth 
    .filter(Boolean) 
    .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid)); 
} 

gibt einen beobachtbaren, dass

userObservable:Object = {}; 

zu

zugeordnet werden kann, aber dann konnte ich keine abonnieren() oder Asynchron darauf ausgeführt werden, die logisch erscheint. Ich hatte versucht, es vor als

userObservable: Observable<any> 

mit dem gleichen seltsamen Ergebnis erklärt (es die beobachtbare „verpackt“ in einem Array zurückkehrt). Ich habe endlich zu der Lösung unter Verwendung von „als FirebaseObjectObservable wie folgt:.

this.userObservable = this.db.getUserAsObjectObservable() as FirebaseObjectObservable<any>; 
    this.userObservable.subscribe(data => console.log('Observable', data)); 

Auf diese Weise der beobachtbaren aus dem Dienst ganz gut zurück

Sie wieder danken

Verwandte Themen