【问题标题】:Why is this JS Function doing a forloop without any reason?为什么这个 JS 函数会无缘无故地执行 for 循环?
【发布时间】: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


【解决方案1】:

.on('value' 正在返回数据库中的所有值和更改。 在update,你正在做一个改变,因为on收到它,然后它再次调用更新,你这里有一个递归。

【讨论】:

    【解决方案2】:

    我通过分解 main 函数解决了这个问题。感谢大家的参与,但正如我在帖子中解释的那样,仅执行 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,
            });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多