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被设置为常量。