所以这个问题使我有点发疯,因为我无法弄清楚,当我执行console.log时,我正在运行一个嵌套在另一个函数中的非常简单的功能,但是当我实现了firebase时东西开始一遍又一遍地重复相同的代码,然后我的电脑死机了。
upvote = index => {
fire
.database()
.ref(`/feed/${this.state.keys[index]}`)
.on('value', snapshot => {
var obj = snapshot.val().score;
this.setState({ score: obj }, () => {
console.log(typeof this.state.score);
console.log(this.state.score + 1);
fire
.database()
.ref(`/feed/${this.state.keys[index]}`)
.update({
score: this.state.score + 1,
});
});
});
};
这里的目标是像reddit一样评论帖子,我正在做的事情可能不正确,但这是其背后的逻辑:
<Button
onClick={() => this.upvote(index)}
>
我确实有一个数组this.state.list,所有帖子都存储在这里,我拿了我要投票的帖子的index
,然后将其传递给函数。
在该函数中,我运行一个实际得分的快速获取操作,当数据库响应时,我检查了该变量的类型,如预期的那样number
。
执行console.log(this.state.score + 1);
会返回确切的值,但是当尝试推送该值时,在重新启动应用程序时,我得到一些很大的数字,例如2983。
请有人协助
答案 0 :(得分:0)
.on('value'
返回数据库中所有值和更改。
在update
中,您要为此进行更改,on
会收到它,然后再次调用update,在这里有递归。
答案 1 :(得分:0)
我通过分解主要功能解决了这个问题。感谢每个人的参与,但是正如我在我的帖子中所解释的,仅执行console.log()
时就没有递归,因此它只是将一个db查询嵌套在另一个查询中,这导致该函数由于更新而无限期运行。
upvote = index => {
fire
.database()
.ref(`/feed/${this.state.keys[index]}`)
.once('value', snapshot => {
var obj = snapshot.val().score;
this.setState({ score: obj }, () => this.up(index));
});
};
up = index => {
console.log(this.state.score);
fire
.database()
.ref(`/feed/${this.state.keys[index]}`)
.update({
score: this.state.score + 1,
});
};