我正在开发一个AngularFire2应用程序,并希望实现基本身份验证。到目前为止,身份验证本身仍然有效,但另外我想在注册时创建用户对象,以便每个用户在数据库中都有一个配置文件。这里的主要问题是AngularFire2服务上的几乎所有方法都返回promise。另一方面,db服务使用observables,firebase.Promise
和observables的组合以某种方式不能按预期工作。
因此,例如,这不起作用:
Observable.fromPromise(() => this.auth$.createUser(credentials))
这会导致错误Argument of type 'Promise<FirebaseAuthState>' is not assignable to parameter of type 'Promise<{}>'
。
同样适用于set
上的db.object
方法。我不知道如何解决这个问题。
我的想法是与承诺一起工作,但在某些时候我必须从一个观察到一个承诺。这就是我所拥有的:
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();
});
});
}
正如您在saveUserEntity
中所看到的,我甚至试图通过自己创建承诺并解决它来解决问题。但不知何故,这种情况永远不会在register()
的源承诺链中解决。 console.log
中的saveUserEntity
被调用,但它永远不会再次上升,并且承诺链不会继续工作。同样,fromPromise
以某种方式具有相同的行为。但是,我可以用saveUserEntity
替换Promise.resolve(1)
的正文,一切正常。不知怎的,this.user.set
让事情变得混乱。
有什么想法吗?
答案 0 :(得分:5)
不幸的是,Angularfire返回的一些承诺是Promise<FirebaseAuthState>
,你必须施展这些承诺。所以这将有效:
Observable.fromPromise(<Promise<any>>this.auth$.createUser(credentials))