Reputation: 463
In my webpage I am trying to do a query from one firebase db and an update on another firebase db.
The issue is when I try to do an update on the second database I get an error saying that the property is undefined.
I have put several console log and I am sure they contain a numeric value so I am not sure why firebase is complaining that the property is undefined.
My HTML Page
<html>
<head>
<meta charset="utf-8">
<title>
Firebase Test
</title>
</head>
<style>
.alright
{
text-align: left;
border: 1px solid black;
border-collapse: collapse;
}
</style>
<body>
<input type="button" value="SHUFFLE" onClick="window.location.reload()">
<table class="alright">
<tr>
<th><h1>Niyant</h1></th>
<th><h1>Varun</h1></th>
</tr>
<!--<tr>
<th><h1 id="niyantscoretag"></h1></th>
<th><h1 id="varunscoretag"></h1></th>
</tr>-->
<tr>
<td><h2 id="ns">0</td>
<td><h2 id="vs">0</td>
</tr>
<tr>
<td><h3 id="nrank">0</td>
<td><h3 id="vrank">0</td>
</tr>
<tr>
<td><img id="imgtag1"/></td>
<td><img id="imgtag2"/></td>
</tr>
<tr>
<td><h2>Winner is</h2></td>
<td><img id="imgtag3"/></td>
</tr>
</table>
<script src="https://www.gstatic.com/firebasejs/3.9.0/firebase.js"></script>
<script>
var config = {
apiKey: "AIzaSyAXpEHm1uLfRLS-6QCun1iVioquEmpmbAI",
authDomain: "helloworld-3c2e7.firebaseapp.com",
databaseURL: "https://helloworld-3c2e7.firebaseio.com",
projectId: "helloworld-3c2e7",
storageBucket: "helloworld-3c2e7.appspot.com",
messagingSenderId: "103101977379"
};
firebase.initializeApp(config);
var otherAppConfig = {
apiKey: "AIzaSyC3UBiLaBJoW0vfY5xJgtFWV_zdKl9vfWo",
authDomain: "scoringdev-b5ede.firebaseapp.com",
databaseURL: "https://scoringdev-b5ede.firebaseio.com",
projectId: "scoringdev-b5ede",
storageBucket: "scoringdev-b5ede.appspot.com",
messagingSenderId: "123331117443"
};
var database1 = firebase.initializeApp(config,"primary");
var database1_database = database1.database();
var database2 = firebase.initializeApp(otherAppConfig, "secondary");
var database2_database = database2.database();
/************HERE**********/
var nscoref = database2_database.ref('Niyant/Score');
var vscoref = database2_database.ref('Varun/Score');
var vscore,nscore,vscoreincremented,nscoreincremented;
nscoref.on('value',
function(snapshot){
nscore = snapshot.val();
nscoreincremented = nscore + 1;
console.log("nscore = "+nscore);
console.log("nscoreincremented = "+nscoreincremented);
}
);
vscoref.on('value',
function(snapshot){
vscore = snapshot.val();
vscoreincremented = vscore + 1;
console.log("vscore = "+vscore);
console.log("vscoreincremented = "+vscoreincremented);
}
);
var URLPath1,URLPath2,nsv,vsv;
var num1 = Math.floor(Math.random() * 100) + 1;
var num2 = Math.floor(Math.random() * 100) + 1;
if(num1 < num2)
{
database2_database.ref('Niyant').set({Score: nscoreincremented});
}
else if(num1 > num2)
{
database2_database.ref('Varun').set({Score: vscoreincremented});
}
var imgref1 = database1_database.ref(num1+'/Location');
var imgref2 = database1_database.ref(num2+'/Location');
var imgref1_name = database1_database.ref(num1+'/Name');
var imgref2_name = database1_database.ref(num2+'/Name');
imgref1.on('value',
function(snapshot){
URLPath1 = snapshot.val();
console.log(URLPath1);
console.log(snapshot.val());
document.getElementById("imgtag1").src = URLPath1;
document.getElementById("nrank").innerText = 'Rank '+num1;
if(num1 < num2)
{
document.getElementById("imgtag3").src = URLPath1;
}
}
);
imgref2.on('value',
function(snapshot){
URLPath2 = snapshot.val();
console.log(URLPath2);
document.getElementById("imgtag2").src = URLPath2;
document.getElementById("vrank").innerText = 'Rank '+num2;
if(num2 < num1)
{
document.getElementById("imgtag3").src = URLPath2;
}
}
);
imgref1_name.on('value',
function(snapshot){
URLPath1_name = snapshot.val();
console.log(URLPath1_name);
console.log(snapshot.val());
document.getElementById("ns").innerText = URLPath1_name;
}
);
imgref2_name.on('value',
function(snapshot){
URLPath2_name = snapshot.val();
console.log(URLPath2_name);
document.getElementById("vs").innerText = URLPath2_name;
}
);
</script>
</body>
</html>
This is from the Chrome console.
The problematic updates are commented out with "***HERE****" in the source for reference.
Can someone help me out here ?
Upvotes: 2
Views: 3831
Reputation: 598728
Data is read from Firebase asynchronously. Your code doesn't cater for that, which leads to you trying to set
a score before it's actually been loaded.
The solution is to properly synchronize access to the data: first ensure that everything is loaded, only then update the score.
var nscoref = database2_database.ref('Niyant/Score');
var vscoref = database2_database.ref('Varun/Score');
var vscore,nscore,vscoreincremented,nscoreincremented;
function updateScore() {
var num1 = Math.floor(Math.random() * 100) + 1;
var num2 = Math.floor(Math.random() * 100) + 1;
if(num1 < num2) {
database2_database.ref('Niyant').set({Score: nscoreincremented});
}
else if(num1 > num2) {
database2_database.ref('Varun').set({Score: vscoreincremented});
}
}
nscoref.on('value', function(snapshot){
nscore = snapshot.val();
nscoreincremented = nscore + 1;
if (nscoreincremented && vscoreincremented) {
updateScore();
}
});
vscoref.on('value', function(snapshot){
vscore = snapshot.val();
vscoreincremented = vscore + 1;
if (nscoreincremented && vscoreincremented) {
updateScore();
}
});
Upvotes: 5