我的问题是来自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?
答案 0 :(得分:1)
此guard文件中有async
,可让该应用正常运行。由于后卫正在从 AuthService 询问getUser()
方法,该方法在返回处带有.toPromise()
:
getUser() {
return this.user$.pipe(first()).toPromise();
}