这个使用 Angularfire2 从 Firebase DB 检索列表的示例究竟是如何工作的?



我不太喜欢JavaScript\TypeScript,我有一些问题来理解这个例子是如何在Angular应用程序中从Firebase数据库中检索数据的。它工作正常,但我对它的逻辑有一些怀疑(我认为它应该与函数式编程范式有关,我不太喜欢这个主题)。

所以我有这段代码,它使用Angularfire2库(新的^5.0.0-rc.4版本)来查询我的 Firebase DB:

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
courses$: Observable<{}[]>;
constructor(private db: AngularFireDatabase) {
console.log("TEST");
this.courses$ = db.list('courses').snapshotChanges()
.map(actions => {
return actions.map(action => ({
$key: action.key,
value: action.payload.val(),
}))
});
this.courses$.subscribe(console.log);
}
}

因此,courses$变量它应该是一个Observable数组(正确吗?据我所知,Observable是一个发出可以订阅的事件的对象。它将包含从 Firebase DB 检索到的列表。

此代码部分:

db.list('courses')

应该只需将courses节点作为列表创建到我的 Firebase 数据库(其中包含节点列表)中的绑定即可。但我不太确定我的解释是否正确,或者我是否遗漏了什么。

然后在此绑定上称为应返回ObservablesnapshotChanges()

在这里,我有以下疑问:

  1. Observable与我正在检索的课程列表中的单个元素有关,还是与从数据库中检索到的整个课程列表有关?(我认为第二个,但我不太确定)。

  2. snapshotChanges()方法返回的确切类型似乎是Observable<SnapshotAction[]>。那么究竟是什么意思。它是一个具有SnapshotAction数组作为类型的可观察对象。究竟是什么,到底是什么意思?

然后是这个map()函数:

.map(actions => {
return actions.map(action => ({
$key: action.key,
value: action.payload.val(),
}))
});

在这里我很困...我认为这是功能更强大的部分。我认为它曾经在每次某些东西变为观察到的courses$时创建我的输出。

阅读文档似乎map()方法创建了一个新数组(实际上我正在创建一个数组),其结果是在此数组中的每个元素上调用提供的函数。

所以这应该意味着这是在数组的每个元素上调用的函数:

actions => {
return actions.map(action => ({
$key: action.key,
value: action.payload.val(),
}))
}

但是什么阵列?我认为它应该是snapshotChanges()方法返回的先前Observable<SnapshotAction[]>

我绝对不确定这个断言....

所以这个想法是,每次订阅courses$可观察的更改发生时,都会对新数据执行map()方法......但我认为我错过了很多中间的东西

这究竟是如何工作的?

根据文档,

AngularFire提供了将数据作为redux兼容流式传输回的方法 行动。

特别是snapshotChanges

以 的 同步数组 的形式返回数据的可观察量 AngularFireAction[]。

因此,此方法返回数据库操作数组的可观察对象。

关于map功能,这里

return actions.map(action => ({
$key: action.key,
value: action.payload.val(),
}))

该示例只是遍历操作数组,并从action.payload.val()中检索与每个操作关联的数据。map这里不是一个可观察的运算符,它是一个数组上的方法。

观察者订阅Observable.然后,该观察者对Observable发出的任何项目或项目序列做出反应。此模式有助于并发操作,因为它不需要在等待Observable发出对象时阻止,而是以观察者的形式创建一个哨兵,随时准备在Observable将来的任何时间做出适当的反应。

最新更新