【问题标题】:Use an Observable working with another Observable使用 Observable 与另一个 Observable 一起工作
【发布时间】:2021-10-21 10:18:30
【问题描述】:

我正在尝试显示信息,如下所示: 用户设置.component.html

<div *ngIf="(_user | async) as user">
  <div fxLayoutAlign="center center">
    <h3>{{ user.surname + ' ' + user.name }}</h3>
  </div>
  <div>
    <span>
      <b>Email : </b>
      {{ user.email }}
    </span>
  </div>
[...]

实际上,在 TS 中我会这样做:

_user = this.db.collection('user').doc("IDENTIFICATION").valueChanges({ idField: 'id' }) as Observable<User>;

问题是 IDENTIFICATION 是静态的,所以我尝试这样做:

user-settings.component.ts

_user: Observable<User> = this.getUser();
[...]
getUser() {
  var userTempo: Observable<User>;

  this.authService.getUser().subscribe(user => {
    userTempo = this.db.collection('user').doc(user.uid).valueChanges({ idField: 'id' }) as Observable<User>;
    console.log(user.uid);
  });
  return userTempo;
}

要知道this.authService.getUser() 来自:

authService.ts

constructor(private afAuth: AngularFireAuth) {}
[...]
getUser() {
  return this.afAuth.user;
}

在此配置中,_user 返回未定义,因此无法显示任何内容。 有人有想法吗? 感谢您的宝贵时间

【问题讨论】:

    标签: html angular typescript firebase observable


    【解决方案1】:

    你必须返回一个 Observable,但你返回的是一个对象,因为你订阅了它并为 userTempo 分配了一个对象。

    
    getUser(): Observable<User> {
      return this.authService.getUser().map(user => {
        console.log(user.uid);
        return this.db.collection('user').doc(user.uid).valueChanges({ idField: 'id' });
      });
    }
    
    

    如果this.db.collection('user').doc(user.uid).valueChanges({ idField: 'id' }) 返回一个 Observable,那么你将不得不这样做。

      getUser(): Observable<User> {
        return this.authService.getUser().switchMap(user => {
          return this.db.collection('user').doc(user.uid).valueChanges({ idField: 'id' });
        }).map(response => {
          return response;
        });
      }
    
    

    【讨论】:

    • 非常感谢,但实际上,我只返回一个像这样的双 Observable:getUser(): Observable&lt;Observable&lt;User&gt;&gt; {[...]},但我怎样才能只返回一个像这样的简单 Observable:Observable&lt;User&gt;? (因为实际版本可以,但没有优化)
    • getUser(): Observable&lt;Observable&lt;User&gt;&gt; { return this.authService.getUser().map(user =&gt; { const userTempo = this.db.collection('user').doc(user.uid).valueChanges({ idField: 'id' }) as Observable&lt;User&gt;; console.log(user.uid); return userTempo; }); }
    • 是的,你的建议返回Observable&lt;Observable&lt;User&gt;&gt;,所以,我正在努力让它返回Observable&lt;User&gt;
    • 哦,我知道为什么,我认为是因为您将数据转换为Observable&lt;User&gt;。从userTempo 中删除以下as Observable&lt;User&gt;; 并尝试。我已经更新了答案。
    • 我可以确认一下,这个调用的返回类型是什么? b.collection('user').doc(user.uid).valueChanges({ idField: 'id' })
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多