这种用于从 Angular 应用程序查询 Firebase 的方法究竟是如何工作的?
Posted
技术标签:
【中文标题】这种用于从 Angular 应用程序查询 Firebase 的方法究竟是如何工作的?【英文标题】:How exactly works this method used to query Firebase from an Angular application? 【发布时间】:2020-10-01 07:08:01 【问题描述】:我正在开发一个 Angular 项目,该项目通过 AngularFirestore 在 Udemy 的课程之后与 Firestore 数据库进行交互,我有以下疑问:
首先课程展示了这种方式来检索 Course 对象的数组,以这种方式:
ngOnInit()
this.db.collection('courses').snapshotChanges()
.subscribe(snaps =>
const courses: Course[] = snaps.map(snap =>
return <Course>
id: snap.payload.doc.id,
...snap.payload.doc.data() as Course
as Course;
)
console.log(courses);
);
所以根据我的理解,它是这样工作的:
在组件初始化中,它调用 AngularFirestore 对象(名为 db)上的 snapshotChanges() 方法来获取课程 Firebase 集合。此方法返回一个 Observable,当集合的元素发生变化时,我可以订阅它以获取整个集合。因此,当 Firebase 中的元素更改时,它会检索一组快照。我使用 map() 运算符迭代每个 snapthsoet 元素,使用其内容创建并返回一个新的 Course 对象,该对象将插入到最终的 课程:课程[]数组。
推理正确吗?如果我的理解是正确的,那么在课程的其他地方它以这种方式实现类似的行为:
ngOnInit()
// Retrieve document sapshot, return all the courses with IDs:
this.courses$ = this.db.collection('courses').snapshotChanges()
.pipe(map(snaps =>
return snaps.map(snap =>
return <Course>
id: snap.payload.doc.id,
...snap.payload.doc.data() as Course
);
));
在这里我发现了一些问题来理解它是如何工作的。
它总是检索 coures Firebase 集合的快照,而不是订阅返回的 Observable 对象,它使用 pipe()。在这种情况下 pipe() 究竟是什么?
然后在我看来,它正在对检索到的快照集合进行迭代(如前一个示例中所做的那样),但随后使用单个快照元素来构建它正在使用的 Course 对象map 第二次在这个 snaps 参数上(应该包含快照列表)
为什么?我错过了什么?
【问题讨论】:
pipe
是 observable 上的一种方法,它允许链接各种 rxjs 运算符。 pipe
表示您可以链接各种运算符,例如(map
[它与 JS 的 array.map 不同]、mergeMap
或许多其他运算符)以根据应用程序需要处理数据。这是 oof rxjs 的基础。另一方面,subscribe
方法,它调用负责可观察对象的函数。我强烈推荐观看youtube.com/watch?v=E3Eego8xKdk 和youtube.com/watch?v=3LKMwkuK0ZE
【参考方案1】:
在第一个示例中,您有一个 Obaervable,this.db.collection('courses').snapshotChanges()
,您只需订阅它。
订阅意味着您激活 Observable,并且从您订阅的那一刻起,您作为参数传入subscribe
方法的函数将被任意调用Observable 通知某事的时间。
在第二个示例中,您将变量 this.courses$
设置为一个 Observable,它是
this.db.collection('courses').snapshotChanges()
.pipe(map(snaps =>
return snaps.map(snap =>
return <Course>
id: snap.payload.doc.id,
...snap.payload.doc.data() as Course
);
));
在这种情况下,源 Observable 仍然是 this.db.collection('courses').snapshotChanges()
。使用pipe
,您可以指定对源 Observable 的转换链。在这里,链很简单,您只需应用一个map
运算符。 map
运算符使用作为参数传入的函数转换源 Observable 通知的任何数据。结果是存储在变量 this.courses$
中的 Observable 将在源 Observable 通知新快照时发出一个 Course
s 数组。
您必须注意到,在第二个示例中,在有人订阅存储在变量 this.courses$
中的 Observable 之前,什么都不会发生。
【讨论】:
以上是关于这种用于从 Angular 应用程序查询 Firebase 的方法究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章
如何将@angular/fire 添加到 Nx 工作区(Angular 项目)?
Observable 在 display 、 ionic app 和 angular fire 从 firestore 获取值后失去价值
子视图初始化后 App.component.ts 中的 Angular 8+ Fire 事件
如何修复:“@angular/fire”'没有导出成员 'AngularFireModule'.ts(2305) ionic、firebase、angular