首页 > 解决方案 > 从 Cloud Firestore 读取数据时,我是否需要使用带有 .valueChanges() 的订阅?

问题描述

以前使用实时数据库我已经习惯使用订阅来监视数据库中的更改。然而,Cloud Firestore 的 .valueChanges() 似乎会自动执行此操作,所以我还需要使用 rxjs 订阅吗?

我的代码在下面完全正常工作,没有我要问的问题,_subscription: Subscription;而不是.valueChanges().subscribe

import { AngularFirestore, AngularFirestoreCollection, AngularFirestoreDocument } from '@angular/fire/firestore';

import * as firebase from 'firebase/app';
import 'firebase/database';
import 'rxjs/Rx';

import { Observable, pipe, of, Subscription } from 'rxjs';
import { switchMap } from 'rxjs/operators';

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

  _data: any = [];
  _subscription: Subscription;
  itemsDocument_data: AngularFirestoreDocument<any[]>;
  itemsCollection_data: AngularFirestoreCollection<any[]>;

  constructor(private _afDB: AngularFirestore) {
    await _dbGeData();
  }

  private async _dbGeData() {
    try {

      if (this._fbData_subscription_User === undefined) {
        this.itemsDocument_users = this._afDB.collection("_myDataPath").doc("_mySecondDatapath");
        this._subscription_data = await this.itemsDocument_data.valueChanges().subscribe((items) => {
          this._data = [];
          for (let i in items) {
            this._data.push = items[i];
          }

          //items (object) is now this._data (Array)

          console.log("items (object)", items);
          console.log("this._data (Array)", this._data);

          return;
        });
      }
    } catch (e) {
      console.error("when getting data", e);
      return;
    }

    return;

  }

  ngOnDestroy() {
    if (this._subscription !== undefined) {
      this._subscription.unsubscribe();
    }
  }

}

标签: angulartypescriptfirebasegoogle-cloud-firestore

解决方案


valueChanges()返回一个可观察的,您必须以一种或另一种方式订阅它才能真正发生任何事情。

你不能留在这个可观察的范围内并在最后一刻订阅(就像在模板中一样AyncPipe)?


推荐阅读