为什么这个JS函数无缘无故地做一个for循环?



所以这个问题让我有点疯狂,因为我只是想不通,我正在运行一个嵌套在另一个函数中的非常简单的函数,当我做控制台时.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。

请有人协助

.on('value'返回数据库中的所有值和更改。 在update中,您正在为此进行更改on接收它,然后它再次调用更新,并且您在这里有一个递归。

我通过分解主函数解决了这个问题。感谢大家的参与,但正如我在帖子中解释的那样,只做console.log()时没有递归,所以它只是将一个数据库查询嵌套在另一个数据库中,导致函数由于更新而无限期运行。

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,
});
};

相关内容

最新更新