我正在使用AngularFire2应用程序并希望实现基本身份验证。身份验证本身工作到目前为止,另外我想在注册时创建一个用户对象,以便每个用户在数据库中都有一个配置文件。这里的主要问题是几乎所有的AngularFire2服务方法都会返回promise。另一方面,数据库服务工作与observables和firebase.Promise
和observables组合不知如何按预期工作。返回承诺的AngularFire2方法不适用于fromPromise
因此,举例来说,这个简化版,工作:
Observable.fromPromise(() => this.auth$.createUser(credentials))
这将导致一个错误说Argument of type 'Promise<FirebaseAuthState>' is not assignable to parameter of type 'Promise<{}>'
。
这同样适用于db.object
上的set
方法。我不知道如何解决这个问题。
我的想法是与承诺一起工作,但是在某些时候,我必须从观察者转向承诺。这是我有:
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
被调用,但它永远不会再次上升,并且承诺链不会继续工作。再次,fromPromise
以某种方式具有相同的行为。不过,我可以用Promise.resolve(1)
替换saveUserEntity
的主体,一切正常。不知何故this.user.set
弄乱了事情。
任何想法?
不幸的是,这似乎并不奏效。我已经尝试过'Observable.fromPromise(> this.auth $ .createUser(凭证)).do(console.log);'和'do'不被调用。 –
LordTribual
尝试'Observable.fromPromise(> this.auth $ .createUser(c redentials))。do( function(x){console.log('Do Next:',x);}, function(err) {console.log('Do Error:',err);}, function(){console.log('Do Completed');} ).subscribe()'你必须订阅 –
为什么我必须订阅?所以'fromPromise'返回一个冷观察? – LordTribual