Цикл для бесконечного цикла с использованием Break? ReactJs

Что происходит: у меня есть эти две переменные: ScorePlayer и ScoreDealer, которые являются результатом суммы элементов, содержащихся в основном массиве каждой из них cardsPlayer и cardsDealer.

И я хочу провести проверку. Если значение переменной ScoreDealer меньше, чем значение переменной ScorePlayer, я хочу, чтобы она добавила в нее больше элементов (ScoreDealer), но я не хочу, чтобы сумма элементов превышала значение 21.

Я использовал метод Break, но бесконечный цикл продолжается и приложение зависает.

Функция, которая делает это:

finishGame = () => {
  const scorePlayer = this.state.cardsPlayer.reduce((a, b) => a + b);

  const scoreDealer = this.state.cardsDealer.reduce((a, b) => a + b);

  for (let i = scoreDealer; scoreDealer < scorePlayer; i++) {

    this.setState({
      cardsDealer: this.state.cardsDealer.concat(this.state.cards.splice(0, 1))
    })

    if (scoreDealer === 21) {
      break;
    }
  }
}

Кто-нибудь может мне помочь?

Ваша логика кажется не совсем правильной. Вы устанавливаете scoreDealer вне цикла, поэтому он никогда не изменится внутри цикла (таким образом, условие никогда не будет выполнено). Кроме того, похоже, что вы относитесь к setState() как к синхронному, но это не так. setState() асинхронный. Вы не можете предположить, что состояние изменилось сразу после его вызова.

Jayce444 08.06.2018 04:47

Кроме того, splice() напрямую изменяет массив, который его вызывает, поэтому ваш код this.state.cards.splice(0, 1) будет напрямую изменять состояние, и это большой недостаток. Непосредственно изменяющееся состояние вызывает проблемы и непредсказуемое поведение.

Jayce444 08.06.2018 04:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

rossipedia заявляет, что это идеально в этом посте.

don't call setState in a loop. What's happening here is exactly what the docs are referring to: this.state is returning the previous value, as the pending state update has not been applied yet.

Вызов setState в цикле обновляет состояние только 1 раз

Причина, по которой ваше приложение продолжает зависать, заключается в том, что значения this.state еще не обновлены и не будут обновлены до тех пор, пока finishGame не завершит выполнение, а также некоторая некорректная логика, как указано в комментариях @ Jayce444 выше.

Решение, которое я бы использовал, сохраняя большую часть вашей логики, это

finishGame = () => {
    // this is a copy of your array given I'm assuming its a 1D array and you can now mutate it
    const cardsDealer = [...this.state.cardsDealer];
    // if you chose to update scorePlayer you should declare it as let.
    const scorePlayer = this.state.cardsPlayer.reduce((a, b) => a + b);
    let scoreDealer = this.state.cardsDealer.reduce((a, b) => a + b);

    for (let i = 0; scoreDealer < 21; i++) {
        scoreDealer += cardsDealer.shift();

        // this will stop if card is >= to 21
        if (scoreDealer >= 21) {
            break;
        }
    }
    // this will set your cards to the new values after the loop is done running.
    this.setState({cardsDealer});
}

учитывая, что в приведенной выше функции требуется много тонкой настройки, я надеюсь, что это даст вам хорошее начало. Удачного кодирования!

Привет, Джошуа, большое спасибо за твой ответ, но выдал эту ошибку: Syntax error: C:/Users/IBM_ADMIN/Desktop/blackjack/blackjack/src/App.js: "scoreDealer" is read-only, ты знаешь почему?

Jota 08.06.2018 17:21

woops, я обновил свой ответ, потому что scoreDealer был установлен как const.

joshua fermin 09.06.2018 03:38

Другие вопросы по теме