我当前正在做一个带有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数据之前调用的,但是我不知道如何解决它。
答案 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。