动态订阅firebase observable

时间:2018-03-19 18:30:37

标签: javascript firebase firebase-realtime-database observable angularfire2

我有一个字符串数组,它们也是我的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);
          })          
        });
  }

2 个答案:

答案 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以获取随时间变化的值。