2016-11-01 22 views
2

我正在使用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弄乱了事情。

任何想法?

回答

5

不幸的是Angularfire返回的一些承诺是Promise<FirebaseAuthState>,你必须承诺这些承诺。所以这将工作:

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

不幸的是,这似乎并不奏效。我已经尝试过'Observable.fromPromise(> this.auth $ .createUser(凭证)).do(console.log);'和'do'不被调用。 – LordTribual

+0

尝试'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()'你必须订阅 –

+0

为什么我必须订阅?所以'fromPromise'返回一个冷观察? – LordTribual