为什么这个JS函数无缘无故地进行forloop?

时间:2018-10-11 13:25:30

标签: javascript reactjs react-native ecmascript-6 jsx

所以这个问题使我有点发疯,因为我无法弄清楚,当我执行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。

请有人协助

2 个答案:

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