Javascript 使用js代码更新firebase数据库中的数据会返回意外循环
几周前,我开始使用javascript和firebase创建自己的游戏,在更新数据方面遇到了一些问题。当我为这个游戏创建一个战斗系统时,我试图让玩家从赢得战斗中获得一些好处。当玩家赢得一场战斗时,我想通过添加经验来更新他的经验(例如),但当我添加另一个更新数据时(当玩家赢得一场战斗时,系统正在更新关于战斗胜利的数据,关于统计数据的数据位置在数据库中的不同位置),它返回循环。 JS代码在这里 //battle_system.jsJavascript 使用js代码更新firebase数据库中的数据会返回意外循环,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,几周前,我开始使用javascript和firebase创建自己的游戏,在更新数据方面遇到了一些问题。当我为这个游戏创建一个战斗系统时,我试图让玩家从赢得战斗中获得一些好处。当玩家赢得一场战斗时,我想通过添加经验来更新他的经验(例如),但当我添加另一个更新数据时(当玩家赢得一场战斗时,系统正在更新关于战斗胜利的数据,关于统计数据的数据位置在数据库中的不同位置),它返回循环。 JS代码在这里 //battle_system.js var opponent = nextBattle.getAttri
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'
}
}
}
}
var-opporter=nextBattle.getAttribute('mon-name');
var-hp=0;
var getPlayer=firebase.database().ref().child('accounts/'+uid+'/character/char');
var get敌军=firebase.database().ref().child('怪物/'+对手);
getPlayer.on('值',(快照)=>{
var getSnapshot=snapshot.val();
GetDebuy.on('value',(snap)=>{
var getSnap=snap.val();
var enemyHp=getSnap.hp;
var playerHp=getSnapshot.hp;
var敌人={
名称:getSnap.name,
hp:enemyHp,
损坏:getSnap.dmg,
装甲:getSnap.armor,
lvl:getSnap.lvl
}
变量播放器={
名称:getSnapshot.nick,
惠普:playerp,
损坏:getSnapshot.dmg,
装甲:getSnapshot.armor,
lvl:getSnapshot.lvl
}
var starCountRef=firebase.database();
btl_section.innerHTML='';
starCountRef.on('value',(snapStat)=>{
var x=(snapStat.val().wins)+1;
变量y=(snapStat.val().loss)+1;
while(player.hp>0&&friend.hp>0){
var MathPlayer=Math.random(),
mathDebuy=Math.random();
敌方.hp-=玩家.damage*玩家;
player.hp-=敌人。伤害*敌人;
btl_section.innerHTML=btl_section.innerHTML+'敌人:'+敌人.hp+'
玩家:'+Player.hp+'
';
如果(player.hp<0){
firebase.database().ref('accounts/'+uid+'/character/battles/stats/'+hatcher)。更新({
损失:y
});
}否则如果(敌方hp<0){
console.log('win');
firebase.database().ref('accounts/'+uid+'/character/battles/stats/'+hatcher)。更新({
胜利:x
});
firebase.database().ref('accounts/'+uid+'/character/char')。更新({
exp:(30*(Math.random()*100))
});
}
}
});
});
});
//火基结构
怪物:{
弗雷德:{
装甲:0,
dmg:10,
级别:1,
惠普:100,
名字:“弗雷德”
}
},
账户:{
uid:{
人物:{
战斗:{
统计数据:{
胜利:0,
输:0
}
},
字符:{
实验:0,
级别:0,
dmg:12,
惠普:100,
装甲:0,
尼克:“昵称”
}
}
}
}
现在,我要说的是,当玩家赢得这场战斗时,经验和胜利的统计数据将毫无问题地添加,但战斗是循环的。当我在浏览器控制台中看到一个关于赢得游戏的consol.log时,我看到了来自result的数百条日志,几秒钟后,游戏返回错误“UncaughtRangeError:超出了最大调用堆栈大小”。现在我需要帮助。我怎样才能解决这个问题