我正在连接到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()
吗?
答案 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/。