我正在尝试从firebase中获取一些数据并将其放在Array
中,有问题的值为listquestion
。为了进行调试,我尝试使用listquestion.map
来显示它,但是没有显示任何内容,但是如果我查看控制台,则Array
内有3个对象。我假设错误是当我尝试将数据放入数组中,但我没有找到解决方法
export function onceGetQuestion() {
var listquestion = [
{
answercount: "",
question: "",
status: ""
}
];
db.ref("questions")
.once("value")
.then(function(snaps) {
const foo = snaps.val();
if (foo !== null) {
Object.keys(foo).forEach(key => {
db.ref("questions")
.child(key)
.once("value")
.then(function(snap) {
var questionlist = listquestion;
questionlist.push({
answercount: snap.val().answercount,
question: snap.val().question,
status: snap.val().status
});
listquestion = questionlist;
});
});
}
});
console.log(listquestion);
return listquestion;
前端(反应)
class HomePage extends Component {
constructor(props) {
super(props);
this.state = {
listquestion: [],
done: undefined
};
}
componentDidMount() {
this.state.listquestion = db.onceGetQuestion();
}
render() {
return (
questions.map(function(position, i){
........
<span >{position.question}</span>
........
}
.......
数组:[1]:https://imgur.com/4hn32Zv
答案 0 :(得分:1)
这是由于回调。通话时
Object.keys(foo).forEach(key => {
db.ref("questions")
.child(key)
.once("value")
.then(function(snap) {
var questionlist = listquestion;
questionlist.push({
answercount: snap.val().answercount,
question: snap.val().question,
status: snap.val().status
});
listquestion = questionlist;
});
即使已经在函数的全局范围中声明了listquestion
,在.then
内分配的值也是本地的,因此当您离开.then
时该值将不复存在< / p>
因此,您必须在.then
内部进行所需的任何处理。
可能的解决方案是从db.ref("questions").once("value")
函数返回诺言(onceGetQuestion()
)。在您的类中创建一种处理方法(该方法将是原始解决方案的then
中的代码)。调用函数返回的值的方法.then
,并在这种情况下(.then
)使用this.setState({})
一条评论指出了有关异步调用的一个很好的答案: https://stackoverflow.com/a/16825593/12016897
ref:https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/