【发布时间】:2019-03-16 14:31:06
【问题描述】:
所以这个问题让我有点发疯,因为我只是想不通,我正在运行一个非常简单的函数,嵌套在另一个函数中,当我执行 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..
请人帮忙
【问题讨论】:
-
您的数据库是否可能正在返回记录列表,并且正在为每条记录调用
on回调。你检查过数据库响应吗? -
on value回调已设置,直到您取消收听为止。您更新值并接收更新的值。那是递归。不应该是.once('value', ...)吗? -
.on 是导致您的问题的原因。 On 是一个侦听器,因此它会反复调用 setState 并使您的计算机过载。老实说,如果我是你,我会废弃这段代码并尝试重写一个不同的解决方案.. 这样做似乎是一个有问题的方法。
标签: javascript reactjs react-native ecmascript-6 jsx