【发布时间】:2016-11-01 11:14:56
【问题描述】:
我正在开发一个 AngularFire2 应用程序并希望实现基本身份验证。到目前为止,身份验证本身有效,但另外我想在注册时创建一个用户对象,以便每个用户在数据库中都有一个配置文件。这里的主要问题是 AngularFire2 服务上的几乎所有方法都返回承诺。另一方面,db 服务与 observables 一起工作,firebase.Promise 和 observables 的组合不知何故无法按预期工作。
例如,这是行不通的:
Observable.fromPromise(() => this.auth$.createUser(credentials))
这会导致错误提示 Argument of type 'Promise<FirebaseAuthState>' is not assignable to parameter of type 'Promise<{}>'。
这同样适用于db.object 上的set 方法。我不知道如何解决这个问题。
我的想法是使用 Promise,但在某些时候我必须从 observable 转换为 Promise。这就是我所拥有的:
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() 的源承诺链中解决。 saveUserEntity 中的 console.log 被调用,但它再也不会上升,promise 链也不会继续工作。同样,fromPromise 以某种方式具有相同的行为。但是,我可以用Promise.resolve(1) 替换saveUserEntity 的主体,一切正常。不知何故,this.user.set 搞砸了。
有什么想法吗?
【问题讨论】:
标签: javascript angular firebase rxjs5 angularfire2