【问题标题】:AngularFirestore snapshotChanges() weird behaviorAngularFirestore snapshotChanges() 奇怪的行为
【发布时间】:2020-07-24 00:13:27
【问题描述】:

我正在尝试使用 Angularfire 和 Firebase 实时数据库进行非常简单的 CRUD 操作。这是我的 Angular 服务正在做的事情:

import { Injectable } from '@angular/core';
import { AngularFirestore } from '@angular/fire/firestore';

@Injectable({
  providedIn: 'root'
})
export class FirestoreService {

  constructor(private db: AngularFirestore) { }

  public getUser(userid: string) {
    return this.db.collection('users').doc(userid).valueChanges();
  }
}

我正在尝试以下列方式使用它。在这个 sn-p this.userid 是一个公共全局 Subject<string>。我检查过,它在以下 sn-p 中提供了正确的用户 ID。

      this.userid.pipe(filter(x => !!x))
        .subscribe(userid => {

          this.firestoreService.getUser(userid)
            .subscribe(result => {
              console.log(result);
            });

        });

与预期相反,控制台输出不是所请求文档(存在)的干净的 JSON,而是大量的原始 JSON 数据。

这有两个奇怪的地方。

  1. 如果我将snapshotChanges() 更改为valueChanges(),结果就是我预期的数据。

  2. 如果我将订阅移到userid 订阅之外,结果又是正确的。

  3. 但这是最奇怪的。如果我重复订阅...

      this.userid.pipe(filter(x => !!x))
        .subscribe(userid => {

          this.firestoreService.getUser(userid)
            .subscribe(result => {
              console.log('----[ DATABASE RESULT ]----');
              console.log(result);
            });

          this.firestoreService.getUser(userid)
            .subscribe(result => {
              console.log('----[ DATABASE RESULT 2 ]----');
              console.log(result);
            });
        })

...然后两个都将返回正确的数据库结果,而不是那么大的奇怪 JSON。

欢迎提出想法、建议。

【问题讨论】:

    标签: angular firebase rxjs angularfire


    【解决方案1】:

    好吧,显然是我没有发现snapshotChanges()valueChanges() 之间的区别。显然只有后者返回文档本身,而前者带来了大量的元数据,因此是“JSON 的热混乱”。

    仅获取一次数据的最佳方法是订阅valueChanges() 并立即退订。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2015-07-20
      • 2010-10-03
      • 2021-07-12
      相关资源
      最近更新 更多