我无法在角度的firestore中获得单个文档

时间:2020-06-28 23:01:41

标签: angular typescript firebase google-cloud-firestore angularfire2

我当前正在做一个带有angular和firebase的项目,问题是,当我想在组件的console.log出现时获取单个文档时,我不确定。这是代码:

import { Injectable } from '@angular/core';
import {
  AngularFirestore,
  AngularFirestoreCollection,
  AngularFirestoreDocument,
} from '@angular/fire/firestore';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Product } from '../interfaces/Product';

@Injectable({
  providedIn: 'root',
})
export class ConexionService {
  private itemsCollection: AngularFirestoreCollection<Product>;
  private items: Observable<Product[]>;
    private itemDoc: AngularFirestoreDocument<Item>;

  constructor(private afs: AngularFirestore) {
    this.itemsCollection = afs.collection<Product>('Products');
    this.items = this.itemsCollection.snapshotChanges().pipe(
      map((actions) =>
        actions.map((a) => {
          const data = a.payload.doc.data() as Product;
          const id = a.payload.doc.id;
          return { id, ...data };
        })
      )
    );
  }

  listItem() {
    return this.items;
  }

  getOne(id: string): any {
    this.afs
      .collection<Product>('Products')
      .doc(id)
      .ref.get()
      .then((doc) => {
        if (doc.exists) {
          console.log(doc.data());
          return doc.data();
        } else {
          return 'Doc does not exits';
        }
      })
      .catch((err) => {
        console.error(err);
      });
  }
}

这在组件中

constructor(private _service: ConexionService){
     console.log('from component-', this._service.getOne('data_1'));
}

这是控制台输出:

来自组件未定义

我认为问题在于该函数是在选择Firebase数据之前调用的,但是我不知道如何解决它。

1 个答案:

答案 0 :(得分:0)

@DougStevenson在评论中提到,您的代码存在问题,因为您执行的get()是异步的,并且会在构造函数中的console.log()执行后返回,因此缺少同步性,为了修复它,您将必须使用以下(未试用的)示例中的promise:

getOne(id: string): any {
    return this.afs
               .collection<Product>('Products')
               .doc(id)
               .ref
               .get()
               .then((doc) => {
                   if (doc.exists) {
                       console.log(doc.data());
                       return doc.data();
                   } else {
                       return 'Doc does not exits';
                   }
                })
                .catch((err) => {
                   console.error(err);
                });
}

constructor(private _service: ConexionService){
    this._service.getOne('data_1').then(value => {
        console.log('from component-', value);
    });
}

那么,这是怎么回事? get().then()方法内的getOne()表示一旦实现承诺,将会发生什么,因此,如果在构造函数中调用then()后使用getOne(),它将等待{中包含的承诺{1}}必须先执行,然后才能执行同步运行的console.log。