【问题标题】:AngularFire2 methods which return a promise do not work with fromPromise返回承诺的 AngularFire2 方法不适用于 fromPromise
【发布时间】: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


    【解决方案1】:

    不幸的是,Angularfire 返回的一些承诺是Promise&lt;FirebaseAuthState&gt;,你必须兑现这些承诺。所以这会起作用:

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

    【讨论】:

    • 不幸的是,这似乎不起作用。我试过Observable.fromPromise(&lt;Promise&lt;any&gt;&gt;this.auth$.createUser(credentials)).do(console.log); 并且do 没有被调用。
    • 试试Observable.fromPromise(&lt;Promise&lt;any&gt;&gt;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 返回一个冷的 observable?
    • 是的,你总是要订阅
    • 好吧,我的user.service呢,也有同样的问题。我正在使用mergeMap,这会自动为我订阅,对吗?不知何故,这也不起作用。
    猜你喜欢
    • 2020-07-02
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多