我是 angular 和 rxjs 的新手,
我正在尝试使用 angularfire2
和 rxjs
从 firebase
获取三个不同的值,并将其作为 promise 返回。经过多次研究和尝试,我终于使用这段代码成功了。
这是代码(假设 afdb 是 angularfire 数据库):
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();
}
代码有效,我得到了 promise ,它解析为包含我需要的三个值的对象。
问题是我不确定这是否是最好的方法(因为我不确定这段代码是如何工作的)。
最佳答案
因为您非常确定您只会获取 .valueChanges()
的第一个值,所以将它们包装到 .forkJoin()
中会更有效率> 而不是 .mergeMapping
他们一路。借助来自 javascript 的解构
,您的代码可以看起来像这样简单得多:
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()
}
关于angular - 这是在 angularfire2 中使用 rxjs MergeMap 的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53275910/