从Firebase快照方法

时间:2017-01-19 23:21:55

标签: arrays angular typescript firebase firebase-realtime-database

我正在连接到Firebase并从指定位置检索数据,我尝试做的是循环遍历snapshot.val()版本和Array,返回Array然后在component.html上循环播放Dropdown

目前我很难搞清楚这种服务方法的语法,这是我目前的代码。 - 这是从app.component.ts

中的ngOnInit()调用的
getExerciseOptions(): Array<Exercise> {

    const items: Exercise[] = [];

    this.exerciseDbRef2.on("value", (snapshot) => {

        snapshot.forEach((snap) => {
            items.push({
                id: snap.key,
                description: snap.val().description
            });
            return false;

        });
    });
}

所以this.exerciseDbRef2指向Firebase中的表格,如下所示:

private exerciseDbRef2 = this.fire.database.ref('/exercise_description');

我目前收到的错误是

A function whose declared type is neither 'void' nor 'any' must return a value.

我理解,所以当我将return false更改为return items时,新错误是:

Argument of type '(snap: DataSnapshot) => Exercise[]' is not assignable to parameter of type '(a: DataSnapshot) => boolean'.
Type 'Exercise[]' is not assignable to type 'boolean'. 

我已经看过使用child_added但是根据我的理解,每次将一个新的孩子添加到该位置时都会调用,这不是我正在寻找的。此位置的孩子不会改变也不会被添加。 - 也许我已经误解了'child_added&#39; ?

我对Firebase很新,所以我在学习曲线的开头,所以请稍等,我还想提一下我目前的工作方式这是不正确的,请引起我的注意。

所以要澄清:连接到Firebase,从给定位置检索所有孩子,即exercise_description表,遍历snapshot,构建Array并返回。

然后在组件循环中通过Array并构建Dropdown

有人可以解释我如何根据Array退回snapshot.val()吗?

1 个答案:

答案 0 :(得分:3)

您无法从getExerciseOptions返回数组,因为value事件是异步的。

但是,你可以回复一个承诺:

getExerciseOptions(): Promise<Array<Exercise>> {
    return this.exerciseDbRef2
      .once("value")
      .then(snapshot => {
        const exercises: Exercise[] = [];
        snapshot.forEach(snap => {
            exercises.push({
                id: snap.key,
                description: snap.val().description
            });
            return false;
        });
        return exercises;
    });
}

然后你会这样称呼它:

getExerciseOptions().then(exercises => console.log(exercises));

如果您不熟悉承诺,可能需要阅读http://www.whatsmyua.com/