会发生什么:我有两个变量:ScorePlayer
和ScoreDealer
,它们是每个变量cardsPlayer
和{的主要数组中包含的元素总和的结果。 {1}}。
我想要的是进行验证。如果cardsDealer
变量的值小于ScoreDealer
变量的值,我希望它在其中添加更多元素(ScorePlayer
),但我不想要元素的总和超过ScoreDealer
的值。
我使用了Break方法,但无限循环继续并挂起应用程序。
执行此操作的功能:
21
有人能帮助我吗?
答案 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});
}
鉴于上述功能需要进行大量微调,我希望它能让你有一个良好的开端。快乐的编码!