循环for循环无限使用Break? ReactJs

时间:2018-06-08 02:11:55

标签: javascript reactjs

会发生什么:我有两个变量:ScorePlayerScoreDealer,它们是每个变量cardsPlayer和{的主要数组中包含的元素总和的结果。 {1}}。

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

我使用了Break方法,但无限循环继续并挂起应用程序。

执行此操作的功能:

21

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

罗斯佩迪亚在这篇文章中表示完美。

  

不要在循环中调用setState。这里发生的是文档所指的内容:this.state返回之前的值,因为还没有应用挂起状态更新。

Calling setState in a loop only updates state 1 time

你的应用程序一直悬挂的原因是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});
}

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