调用 returns Observable 而不是实际对象

Call returns Observable instead of actual object

我对 this.dashboardFacade.getCurrentUser(uid).then((user) => console.log(user)); 的调用一直返回一个 Observable 对象而不是实际的数据对象 - 有人知道如何修复它吗?

DashboardComponent

this.dashboardFacade.getCurrentUserUid().then((uid) => {
  if (uid) {
    this.dashboardFacade.getCurrentUser(uid).then((user) => console.log(user));
  }
});

DashboardFacade

  getCurrentUser(uid: string): Promise<unknown> {
    return this.userService.getUser(uid);
  }

用户服务

  getUser(uid: string): Promise<unknown> {
    return firebase
      .auth()
      .currentUser.getIdToken()
      .then((token: string) => {
        this.logger.debug(`Token generated: ${token}`);
        return this.httpClient
          .get(`${environment.apiBasePath}/users`, {
            headers: { authorization: `Bearer ${token}` },
          })
      });
  }

正在尝试做:

this.dashboardFacade.getCurrentUserUid().then(uid => {
  if(uid) {
    this.dashboardFacade.getCurrentUser(uid).subscribe(
     (user) => console.log(user)
    )
  }
});

抛出以下错误:

Uncaught (in promise): TypeError: this.dashboardFacade.getCurrentUser(...).subscribe is not a function TypeError: this.dashboardFacade.getCurrentUser(...).subscribe is not a function in DashboardComponent

在 javascript 中,您拥有我们所说的 Promise Chain。当我承诺 return 一个 Promise 时会发生这种情况,中间的 promise 有点不可见,你会收到链中最后一个已解决的 promise 的结果。

你的方法 getUser return 一个 Promise,但是这个 Promise 实际上不是 return 另一个 promise 而是一个 Observable,在这种情况下链式 promise 是没有参与,你会收到一个 Observable。如果你不需要观察,你可以做什么来将你的方法转换为 return Promise :

  getUser(uid: string): Promise<unknown> {
    return firebase
      .auth()
      .currentUser.getIdToken()
      .then((token: string) => {
        this.logger.debug(`Token generated: ${token}`);
        return this.httpClient
          .get(`${environment.apiBasePath}/users`, {
            headers: { authorization: `Bearer ${token}` },
          }).toPromise();                       <<<< transform to observable as promise
      });
  }

关于你的错误,这也是“正常”的

this.dashboardFacade.getCurrentUserUid().then(uid => {
  if(uid) {
    this.dashboardFacade.getCurrentUser(uid).subscribe(
     (user) => console.log(user)
    )
  }
});

this.dashboardFacade.getCurrentUser(uid) 实际上 return 一个 Promise (of Observable) 而不是一个 Observable,所以你需要等待这个 promise 被 resolved 之后正在订阅

可能是这样的(如果你在 getUser 方法中保持可观察)

this.dashboardFacade.getCurrentUserUid().then(uid => {
  if(uid) {
    this.dashboardFacade.getCurrentUser(uid).then(currentUserOsb => {
        currentUserObs.subscribe(user => console.log(user));
    });
  }
});