【问题标题】:Why can I use an Observable without subscribe?为什么我可以在不订阅的情况下使用 Observable?
【发布时间】:2019-03-16 08:10:17
【问题描述】:

我的问题是来自 Jeff Delaney 的示例 https://github.com/AngularFirebase/144-firestore-group-chat。 我试图理解为什么可以在没有 subscribe() 的情况下使用 observable。

例如来自 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?

【问题讨论】:

  • 也许它会被传递给一些框架代码,这些代码需要一个 observable。也许模板中有一个异步管道。给你一个minimal reproducible example你的尝试来适应你的需求。
  • 基本上我只是想知道在这个例子中它是如何实现的。这就是我发布 Github 存储库的原因。有一些地方在没有 subscribe() 的情况下使用 observables。我不明白为什么。
  • 期望人们通读一堆甚至没有问题的代码是不合理的。另请注意,为什么与如何是不同的问题。
  • 你是对的。我的错。我应该改变问题还是什么?
  • 您可以edit 将其归结为您拥有的一个特定查询。

标签: angular firebase google-cloud-firestore


【解决方案1】:

在这个guard 文件中有async,它允许应用程序正常工作。由于守卫从 AuthService 中询问 getUser() 方法,返回时有 .toPromise()

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

【讨论】:

  • 那么'chat.service.ts'中的'getUserChats()'和'joinUsers()'函数呢?他们是否也因为各自 HTML 文件中的异步调用而做出承诺?
  • 是的,它们在 html 文件中被用作async 管道。
  • 知道我明白了。谢谢!
猜你喜欢
  • 2021-04-02
  • 2020-10-17
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多