我有一个字符串数组,它们也是我的Firebase实时数据库中端点的键。我想循环遍历这个数组,并获取每个键的Firebase对象。
我对下面的代码没有回复
有没有办法动态订阅Firebase Observables?
sortedArray:any = ["x","y","z"]
方法:
getItems() {
this.sortedArray.forEach(el => {
this.ngDB.object(`items/${el}`).valueChanges()
.toPromise().then((res) => {
console.log("Found Item",res);
})
.catch(err => {
console.log("Err listing items", err);
})
});
}
答案 0 :(得分:0)
问题与此处有关:getItems() {
this.sortedArray.forEach(el => {
this.ngDB.object(`items/${el}`)
.valueChanges()
.subscribe(res => {
console.log("Found Item",res);
}, err => {
console.log("Err listing items", err);
})
});
}
当您从可观察更改为承诺时,该代码不再跟踪更改。继续使用你的Observable并订阅。
col_no = 3 to 29
答案 1 :(得分:0)
我坚持使用Angular的Observables。最终,这里的答案取决于你需要如何“扁平化”。它们。
简单地说,您可以合并所有valueChanges
getItems() {
Observable.withLatestFrom(
this.sortedArray
.map { id => this.ngDB.object(`items/${id}`).valueChanges() }
)
}
但这有几种反模式;即你有一个" getter"对于一个可观察的。与Promise不同,Observable是开箱即用的懒惰,所以不需要用函数包装。 此外,getter函数只是要求麻烦,因为如果多次调用它会得到令人惊讶的结果,你如何处理所有订阅?你没有跟踪它们。
更好的模式是设置项目(或items$
是否使用芬兰表示法)作为属性。但是如果你改变sortedArray
怎么办?您需要处理现有订阅并更改Observables ...如果我们将sortedArray
更改为Observable
(或BehaviorSubject
,则需要轻松与非互操作Rx)我们得到了所有这些" free"使用switchMap
:
this.items = this.sortedArray.switchMap(ids =>
Observable.combineLatest(
ids.map { id => this.ngDB.object(`items/${id}`).valueChanges() }
}
}
然后在视图中使用async
管道,使用RxJS运算符将其与其他可观察对象混合并匹配,或者调用.subscribe
以获取随时间变化的值。