Почему эта функция JS без всякой причины делает forloop? - PullRequest
0 голосов
/ 11 октября 2018

Так что эта проблема немного сводит меня с ума, потому что я просто не могу понять это, я запускаю очень простую функцию, вложенную в другую, когда я выполняю 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 сообщения, которое хочу поднять, затем передаю егоfunction.

Внутри функции я запускаю быструю выборку действительного результата, когда дБ отвечает, проверяет тип этой переменной, как и ожидалось, это number.

Выполнение console.log(this.state.score + 1); возвращаетточное значение, но при попытке подтолкнуть его, я получаю огромные цифры, такие как 2983 при перезапуске приложения ..

Пожалуйста, кто-нибудь помогите

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я решил эту проблему, просто разложив основную функцию.Спасибо всем за участие, но, как я объяснил в своем посте, при выполнении только 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,
        });
};
0 голосов
/ 11 октября 2018

.on('value' возвращает все значения и изменения в БД.В update вы делаете изменение для этого, on получает его, а затем снова вызывает update, и у вас есть рекурсия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...