2017-04-08 3 views
0

Ich lese Wert von PID aus Firebase-Datenbank und dann mit diesem PID-Wert, ich hole weitere Werte aus der Datenbank.Abrufen und Anzeigen von Daten aus Firebase braucht Zeit

//fetching pid 
firebaseRef.once("value") 
    .then(function(snapshot) { 
    snapshot.forEach(function(childSnapshot) { 
     //getting key of the child 
     var pid = childSnapshot.key; 
     // childData will be the actual contents of the child 
     var childData = childSnapshot.val(); 
     pid[i].id = "pid" + (i + 1); 
     document.getElementById(pids[i].id).innerText = pid; 
     i++; 
    }); 
    }); 

//displaying marks 
var pid1 = document.getElementById("pid1").innerHTML; 
guideRef = firebase.database().ref("internal").child(pid1).child("guide"); 
guideRef.child("report").once('value').then(function(snapshot) { 
    document.getElementById(reportGuideMarks).value = snapshot.val(); 
}); 

Aber runnning diesen Code bekomme ich diesen Fehler:

Uncaught Error: Firebase.child failed: First argument was an invalid path: "". Paths must be non-empty strings and can't contain ".", "#", "$", "[", or "]"

Der pid Fehler zurückzuführen ist null PID1 ist. Aber wenn ich eine Verzögerung von 3 Sekunden auf den "Anzeigemarkierungen" setze, läuft der Code perfekt.

Die angezeigten Markierungen werden ausgeführt, noch bevor die Werte von pid gesetzt wurden.

Es dauert ein paar Sekunden, um den Wert von pid in der Tabelle festzulegen.

Was ist das Problem? Warum dauert das Laden der Datenbankwerte so lange? Oder ist es ein Problem mit der Einstellung des Wertes?

+0

definieren 'var pid;' draußen vor dem '.once', nicht wahr? Gleiches gilt für 'pid1'. Was ist "[i]"? Ich sehe nicht, dass "ich" deklariert wurde, d. H. Du verwendest keine for-Schleife, was du für "Jeder" tust. Schließlich verschachteln Sie '.once' Methoden? Könnte "provey.all" verwenden oder diese nicht verschachteln oder die ".thens" verketten? –

Antwort

1

Anforderungen an Feuerbasis sind asynchrone so der „Anzeigen von Markierungen“ Code ausgeführt wird, bevor die „Holen des pid“ Code abgeschlossen hat.

Sie könnten eine weitere hinzufügen then() so dass der zweite Teil wird erst ausgeführt, wenn der erste Teil abgeschlossen ist

//fetching pid 
firebaseRef.once("value") 
    .then(function(snapshot) { 
    snapshot.forEach(function(childSnapshot) { 
     //getting key of the child 
     var pid = childSnapshot.key; 
     // childData will be the actual contents of the child 
     var childData = childSnapshot.val(); 
     pid[i].id = "pid" + (i + 1); 
     document.getElementById(pids[i].id).innerText = pid; 
     i++; 
    }); 
    }) 
    // new then() won't fire until prior then() is completed 
    .then(function() {  
    //displaying marks 
    var pid1 = document.getElementById("pid1").innerHTML; 
    guideRef = firebase.database().ref("internal").child(pid1).child("guide"); 
    guideRef.child("report").once('value').then(function(snapshot) { 
     document.getElementById(reportGuideMarks).value = snapshot.val(); 
    }); 

    }) 
+1

könnte auch Anzeigemarkierungscode in eine Funktion einbinden und diese Funktion dann am Ende von zuerst aufrufen – charlietfl

Verwandte Themen