首页 > 解决方案 > 订阅承诺

问题描述

在我的 Angular 7 应用程序中,我有下一个功能:

  getUserData(uid) {
    return this.fireStore.collection('users').doc(uid).valueChanges().subscribe(data => {
      this.writeCookie(data)
      this.currentUser = data;
    })
  }

我想在另一个方法中使用这个函数:

   someMethod() {
      ...
      new Promise(this.getUserData(uid))
         .then(() => {...})
      ...
   }

但我不能这样做,因为 TypeScript 会抛出错误:

'Subscription' 类型的参数不可分配给 '(resolve: (value?: {} | PromiseLike<{}>) => void, reject: (reason?: any) => void) => void' 类型的参数. 类型 'Subscription' 不提供签名匹配 '(resolve: (value?: {} | PromiseLike<{}>) => void, reject: (reason?: any) => void): void'.ts(2345 )

如何将getUserData()方法转换为承诺,或forJoin改用?

提前致谢。

标签: angulartypescriptpromiserxjsangular-promise

解决方案


subscribe将类型从 更改ObservableSubscription,从而导致类型错误。

您可能想要的是将 Observable 转换为 Promise,同时保留函数调用。您可以通过管道传递 Observabletap然后使用toPromise. 像这样:

getUserData(uid) {
  return this.fireStore.collection('users').doc(uid).valueChanges().pipe(
    tap(data => {
      this.writeCookie(data)
      this.currentUser = data;
    }),
    first()
  ).toPromise()
}

确保创建一个完成的管道,就像你可以对first操作符做的那样,否则 Promise 永远不会解决。

new Promise(...)您可以在您的消费者中省略。


推荐阅读