返回promise的AngularFire2方法不适用于fromPromise

时间:2016-11-01 11:14:57

标签: javascript angular firebase rxjs5 angularfire2

我正在开发一个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让事情变得混乱。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

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

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