2016-11-01 3 views
2

Ich arbeite an einer AngularFire2-Anwendung und möchte die Standardauthentifizierung implementieren. Die Authentifizierung selbst funktioniert bisher, aber zusätzlich möchte ich bei der Registrierung ein Benutzerobjekt erstellen, so dass jeder Benutzer ein Profil in der Datenbank hat. Das Hauptproblem hier ist, dass fast alle Methoden auf dem AngularFire2-Dienst Versprechen verspricht. Auf der anderen Seite arbeitet der DB-Dienst mit Observablen und die Kombination von firebase.Promise und Observables funktioniert irgendwie nicht wie erwartet.AngularFire2-Methoden, die ein Versprechen zurückgeben, funktionieren nicht mit fromPromise

So zum Beispiel does't diese Arbeit:

Observable.fromPromise(() => this.auth$.createUser(credentials)) 

Dies zu einem Fehler führt Argument of type 'Promise<FirebaseAuthState>' is not assignable to parameter of type 'Promise<{}>' sagen.

Das gleiche gilt für die set Methode auf einem db.object. Ich weiß nicht, wie ich dieses Problem beheben kann.

Meine Idee war, mit den Versprechen zu arbeiten, aber irgendwann muss ich dann von einem Observablen zu einem Versprechen übergehen. Das ist, was ich habe:

auth.service.ts

register(credentials: ICredentials): firebase.Promise<FirebaseAuthState> { 
    return this.auth$.createUser(credentials) 
    .then((response: FirebaseAuthState) => this.userService.createUserEntity(response)) 
    .then(() => this.postSignIn()) 
    .catch((error: Error) => this.onError(error)); 
} 

user.service.ts

createUserEntity(response: FirebaseAuthState): Promise<boolean> { 
    this.user = this.db.object(`/users/${response.uid}`); 

    return this.user 
    .take(1) 
    .filter((snapshot: Snapshot) => !snapshot.$exists()) 
    .mergeMap(() => this.createUser(response)) 
    .toPromise(); 
} 

private createUser(response: FirebaseAuthState): Observable<any> { 
    const { email, displayName, photoURL, providerId } = response.auth; 

    return Observable.of(new User(email, displayName, photoURL, providerId)) 
    .mergeMap((user) => this.saveUserEntity(user)); 
} 

private saveUserEntity(user): Promise<any> { 
    return new Promise((resolve, reject) => { 
    this.user.set(user).then(() => { 
     console.log('RESOLVE'); 
     resolve(); 
    }); 
    }); 
} 

Wie Sie im saveUserEntity sehen können, habe ich sogar versucht, Arbeite herum, indem du selbst ein Versprechen machst und es auflöst. Aber irgendwie löst sich das nie in der Quellversprechungskette in register() auf. Die console.log in saveUserEntity heißt, aber es geht nie wieder hoch, und die Versprechenskette funktioniert nicht weiter. Auch hier hat fromPromise irgendwie das gleiche Verhalten. Ich kann jedoch den Körper von saveUserEntity durch Promise.resolve(1) ersetzen und alles funktioniert. Irgendwie versaut die this.user.set Dinge.

Irgendwelche Ideen?

Antwort

5

Leider sind einige der von Angularfire zurückgegebenen Versprechen Promise<FirebaseAuthState>, Sie müssen diese Versprechen halten. So funktioniert das:

Observable.fromPromise(<Promise<any>>this.auth$.createUser(credentials)) 
+0

Leider scheint dies nicht zu funktionieren. Ich habe versucht, 'Observable.fromPromise (> this.auth $ .createUser (Anmeldeinformationen)). Do (console.log); 'und das' do' wird nicht aufgerufen. – LordTribual

+0

versuchen Sie 'Observable.fromPromise (> this.auth $ .createUser (Berechtigungsnachweis)). Do ( Funktion (x) {console.log ('Do Next:', x);}, Funktion (err) {console.log ('Do Error:', err);}, function() {console.log ('Abgeschlossen');} ) .subscribe() 'Sie müssen abonnieren –

+0

Warum muss ich abonnieren? ? Also 'fromPromise' gibt eine kalte Observable zurück? – LordTribual

Verwandte Themen