Несколько недель назад я начал создавать свою собственную игру, используя javascript и firebase, и у меня были некоторые проблемы с обновлением данных.Когда я создавал боевую систему для этой игры, я пытался дать игрокам некоторую выгоду от побед в боях.Когда игрок выиграл битву, я хотел обновить его (например) опыт, добавив опыт, и это сработало, но когда я добавил еще одно обновление данных (когда игрок выиграл бой, система обновляла данные о победах в боях и расположение данных о статистикебыли в другом месте в базе данных), он возвращает цикл.Код JS здесь
// battle_system.js
var opponent = nextBattle.getAttribute('mon-name');
var hp = 0;
var getPlayer = firebase.database().ref().child('accounts/' + uid + '/character/char');
var getEnemy = firebase.database().ref().child('Monsters/' + opponent);
getPlayer.on('value', (snapshot) => {
var getSnapshot = snapshot.val();
getEnemy.on('value', (snap) => {
var getSnap = snap.val();
var enemyHp = getSnap.hp;
var playerHp = getSnapshot.hp;
var enemy = {
name: getSnap.name,
hp: enemyHp,
damage: getSnap.dmg,
armor: getSnap.armor,
lvl: getSnap.lvl
}
var player = {
name: getSnapshot.nick,
hp: playerHp,
damage: getSnapshot.dmg,
armor: getSnapshot.armor,
lvl: getSnapshot.lvl
}
var starCountRef = firebase.database().ref('accounts/' + uid + '/character/battles/stats/' + opponent);
btl_section.innerHTML = '';
starCountRef.on('value', (snapStat) => {
var x = (snapStat.val().wins)+1;
var y = (snapStat.val().loses)+1;
while(player.hp > 0 && enemy.hp > 0){
var MathPlayer = Math.random(),
MathEnemy = Math.random();
enemy.hp -= player.damage * MathPlayer;
player.hp -= enemy.damage * MathEnemy;
btl_section.innerHTML = btl_section.innerHTML + 'Enemy: ' + enemy.hp + '<br> Player: ' + player.hp + '<br>';
if(player.hp < 0){
firebase.database().ref('accounts/' + uid + '/character/battles/stats/' + opponent).update({
loses : y
});
}else if(enemy.hp < 0) {
console.log('win');
firebase.database().ref('accounts/' + uid + '/character/battles/stats/' + opponent).update({
wins : x
});
firebase.database().ref('accounts/' + uid + '/character/char').update({
exp : (30 * (Math.random()*100))
});
}
}
});
});
});
//firebase structure
Monsters: {
Freder : {
armor: 0,
dmg: 10,
lvl: 1,
hp: 100,
name: 'Freder'
}
},
accounts:{
uid:{
character:{
battles:{
stats: {
wins: 0,
loses: 0
}
},
char:{
exp: 0,
lvl: 0,
dmg: 12,
hp: 100,
armor: 0,
nick: 'Nickname'
}
}
}
}
И теперь, за исключением того, что, когда игрок выигрывает битву, опыт и статистика выигрышей будут добавляться без проблем, но битвазацикливаетсяКогда я вижу в консоли браузера файл consol.log о выигрышной игре, я вижу сотни результатов из результата, и через несколько секунд игра возвращает ошибку «Uncaught RangeError: Превышен максимальный размер стека вызовов».И теперь мне нужна помощь по этому поводу.Как я могу это исправить?