angular - 这是在 angularfire2 中使用 rxjs MergeMap 的正确方法吗?
问题描述
我是 angular 和 rxjs 的新手,我试图通过firebase
使用angularfire2
and获得三个不同的值rxjs
,并将其作为承诺返回。经过多次研究和尝试,我终于通过使用此代码实现了它。
这是代码(假设 afdb 是 angularfire-database):
getThreeValues() {
return this.afdb.list('firebaseref1').valueChanges().pipe(
map(data => {
return data.length;
}),
mergeMap(first => {
return this.afdb.object('firebaseref2').valueChanges().pipe(
map(second => {
return ({first: first, second: second})
}),
take(1)
);
}),
mergeMap(firstsecond => {
return this.afdb.list('firebaseref3').valueChanges().pipe(
map(third => {
return ({...firstsecond, third: third})
}),
take(1)
);
}),
take(1))
.toPromise();
}
代码有效,我得到了承诺,它解析为包含我需要的三个值的对象。
问题是我不确定这是否是最好的方法(因为我不确定这段代码是如何工作的)。
解决方案
因为你很确定你只会取你的第一个值,所以将它们包装成 a而不是它们.valueChanges()
会更有效。在 from javascript 的帮助下,您的代码看起来会更简单,如下所示:.forkJoin()
.mergeMapping
destructuring
getThreeValues() {
return forkJoin(
this.afdb.list('firebaseref1').valueChanges().pipe(take(1)),
this.afdb.object('firebaseref2').valueChanges().pipe(take(1)),
this.afdb.object('firebaseref3').valueChanges().pipe(take(1))
)
.pipe(
map(([first, second, third]) => ({
first: first.length,
second,
third
}))
).toPromise()
}
推荐阅读
- json - Flutter - 使用 json_serializable 反序列化 firebase_messagin 通知
- ruby - 如何检查是否提供了正确的日期格式
- sas - 有没有办法在 SAS 中进行条件转置?
- reactjs - React:强制完全更新组件
- bash - 检查当前日期的文件是否存在
- c++ - C ++:用于排序元素的结构与函数
- java - 为什么我不能使用我新创建的 API 密钥?
- python - Python:使用 importlib 从字符串中动态导入模块的代码
- kotlin - 如何清除协程 Channel 发送的值?
- c# - 有没有办法中止一个线程,然后用一个新变量再次打开它?