【问题标题】:Loop for with loop infinite using Break? ReactJs使用Break进行循环无限循环?反应式
【发布时间】:2018-11-18 00:41:34
【问题描述】:

会发生什么:我有这两个变量:ScorePlayerScoreDealer,它们是它们各自的主数组中包含的元素之和的结果cardsPlayercardsDealer

而我想要做的是验证。如果ScoreDealer 变量的值小于ScorePlayer 变量的值,我希望它在其中添加更多元素(ScoreDealer)但我不希望元素的总和超过@ 的值987654328@.

我使用了 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() 是异步的。你不能假设状态在调用后直接改变了。
  • 另外,splice() 直接改变调用它的数组,所以你的代码this.state.cards.splice(0, 1) 将直接改变状态,这是一个很大的禁忌。直接改变状态会导致问题和不可预测的行为。

标签: javascript reactjs


【解决方案1】:

rossipedia 在这篇文章中说它是完美的。

不要在循环中调用 setState。这里发生的事情正是文档所指的:this.state 正在返回以前的值,因为尚未应用挂起的状态更新。

Calling setState in a loop only updates state 1 time

您的应用一直挂起的原因是 this.state 的值尚未更新,并且在 finishGame 执行完毕之前不会更新,以及上面 cmets 中 @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});
}

鉴于上述函数需要进行大量微调,我希望它能让您有一个良好的开端。编码愉快!

【讨论】:

  • 你好 joshua,非常感谢你的回答,但给出了错误:Syntax error: C:/Users/IBM_ADMIN/Desktop/blackjack/blackjack/src/App.js: "scoreDealer" is read-only,你知道为什么吗?
  • 哎呀,我更新了我的答案,因为 scoreDealer 被设置为常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多