为什么不用订阅就可以使用Observable?

时间:2019-03-16 08:10:17

标签: angular firebase google-cloud-firestore

我的问题是来自Jeff Delaney的示例https://github.com/AngularFirebase/144-firestore-group-chat。 我试图理解为什么不用subscribe()就可以使用可观察对象。

例如,来自Github存储库的auth.service.ts:

import { Injectable } from '@angular/core';
import { Router } from '@angular/router';

import { auth } from 'firebase/app';
import { AngularFireAuth } from '@angular/fire/auth';
import {
  AngularFirestore,
  AngularFirestoreDocument
} from '@angular/fire/firestore';

import { Observable, of } from 'rxjs';
import { switchMap, first, map } from 'rxjs/operators';

@Injectable({ providedIn: 'root' })
export class AuthService {
  user$: Observable<any>;

  constructor(
    private afAuth: AngularFireAuth,
    private afs: AngularFirestore,
    private router: Router
  ) {
    this.user$ = this.afAuth.authState.pipe(
      switchMap(user => {
        if (user) {
          return this.afs.doc<any>(`users/${user.uid}`).valueChanges();
        } else {
          return of(null);
        }
      })
    );
  }

构造函数或项目的其余部分都没有subscribe(),但是该示例可以正常工作。

另一个例子是在chat.service.ts中的此功能:

getUserChats() {
    return this.auth.user$.pipe(
      switchMap(user => {
        return this.afs
          .collection('chats', ref => ref.where('uid', '==', user.uid))
          .snapshotChanges()
          .pipe(
            map(actions => {
              return actions.map(a => {
                const data: Object = a.payload.doc.data();
                const id = a.payload.doc.id;
                return { id, ...data };
              });
            })
          );
      })
    );
  }

为什么在没有subscribe()的情况下可以使用Observable?

1 个答案:

答案 0 :(得分:1)

guard文件中有async,可让该应用正常运行。由于后卫正在从 AuthService 询问getUser()方法,该方法在返回处带有.toPromise()

getUser() {
    return this.user$.pipe(first()).toPromise();
}