Почему я могу использовать Observable без подписки? - PullRequest
0 голосов
/ 16 марта 2019

Моя проблема в этом примере https://github.com/AngularFirebase/144-firestore-group-chat от Джеффа Делани. Я пытаюсь понять, почему можно использовать наблюдаемое без subscribe().

Например, auth.service.ts из репозитория Github:

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 };
              });
            })
          );
      })
    );
  }

Почему можно использовать Observable без subscribe()?

1 Ответ

1 голос
/ 16 марта 2019

В этом файле guard есть async, что позволяет приложению работать должным образом. Так как охранник запрашивает getUser() метод у AuthService , который имеет .toPromise() в ответе:

getUser() {
    return this.user$.pipe(first()).toPromise();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...