如何查询Firebase一次并将该返回值存储在本地参数中?

时间:2016-12-12 14:04:33

标签: angular rxjs angularfire2

我正在尝试使用AngularFire2从Firebase数据库中总结一些值,并将它们用于我的组件逻辑中的进一步处理。 通过一些建议,我能够查询并减少所需的值(How to map and reduce child values from FirebaseListObservable),但是当我尝试将它们放入局部变量进行进一步处理时,在第一次运行时该值始终未定义。

我尝试使用first()来确保observable只运行一次并且没有结果。

当点击按钮时,我怎样才能获得一次的值?

这是我的代码:

//sum up scores for questions belonging to category 'id'
...
let scoresObservable = this.dbRef.database.list(`/question-answers/${id}`)
                        .first()
                        .map((array) => array.reduce((acc, element) => 
                                        acc + element.$value, 0));
let result;
let total  = scoresObservable.subscribe(sum => {
                result = sum;
                console.log(`total for ${id}: ` + sum)
             });
return result;

结果总是“未完成”'当第一次调用此块时。

1 个答案:

答案 0 :(得分:0)

您传递到scoresObservable.subscribe的函数不会立即被调用(当database.list将检索数据时将调用它),因此订阅后result中没有值。< / p>

如果要在模板中显示结果并且代码块在控制器内,那么您可以执行以下操作:

@Comopnent({
  ...
  template: '{{ result }}'
  ...
})
class SomeComponent {
  result: number;

  ...

  someFunc() {
    ...

    scoresObservable.subscribe(sum => {
      this.result = sum;
      console.log(`total for ${id}: ` + sum)
    }
}

另请注意,subscribe会返回订阅,total看起来不合适。