Javascript 循环为无限循环使用中断?反应

Javascript 循环为无限循环使用中断?反应,javascript,reactjs,Javascript,Reactjs,发生的情况:我有两个变量:ScorePlayer和ScoreDealer,它们是包含在每个cardsPlayer和cardsdeler主数组中的元素总和的结果 我想做的是验证。如果ScoreDealer变量的值小于ScorePlayer变量的值,我希望它在其中添加更多元素(ScoreDealer),但我不希望元素的总和超过21的值 我使用了Break方法,但是无限循环继续并挂起了应用程序 执行此操作的函数: finishGame = () => { const scorePlayer

发生的情况:我有两个变量:
ScorePlayer
ScoreDealer
,它们是包含在每个
cardsPlayer
cardsdeler
主数组中的元素总和的结果

我想做的是验证。如果
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;
    }
  }
}
finishGame=()=>{
const scorePlayer=this.state.cardsPlayer.reduce((a,b)=>a+b);
const scoredaler=this.state.cardsdeler.reduce((a,b)=>a+b);
for(设i=scoreDealer;scoreDealer

有人能帮我吗?

rossipedia在这篇文章中说它很完美

不要在循环中调用setState。这里发生的事情正是文档所指的: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});
}
finishGame=()=>{
//这是你的数组的副本,我假设它是1D数组,你现在可以对它进行变异
const cardsdeler=[…this.state.cardsdeler];
//如果您选择更新scorePlayer,则应将其声明为let。
const scorePlayer=this.state.cardsPlayer.reduce((a,b)=>a+b);
让scoredaler=this.state.cardsdeler.reduce((a,b)=>a+b);
对于(设i=0;scoredaler<21;i++){
scoredaler+=cardsdeler.shift();
//如果卡大于等于21,则此操作将停止
如果(分数>=21){
打破
}
}
//这将在循环运行完成后将您的卡设置为新值。
this.setState({cardsdeler});
}

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

你的逻辑似乎不太正确。您在循环外部设置了
scoredaler
,因此它在循环内部永远不会改变(因此,条件永远不会得到满足)。另外,它看起来像是在处理
setState()
,好像它是同步的,而不是同步的<代码>设置状态()
是异步的。你不能假设状态在调用它后已经直接改变。另外,
splice()
直接变异调用它的数组,因此你的代码
this.state.cards.splice(0,1)
将直接变异状态,这是一个很大的问题。直接变异状态会导致问题和不可预测的行为。你好,joshua,非常感谢您的回答,但给出了错误:
语法错误:C:/Users/IBM_ADMIN/Desktop/blackjack/blackjack/src/App.js:“scoreDealer”是只读的,您知道为什么吗?woops我更新了我的答案,因为scoreDealer被设置为常量。