2017-07-16 2 views
0

Ich erstelle eine Chat-Anwendung, mit der Benutzer Räume erstellen können, um bestimmte Themen zu diskutieren. Ein Problem, das ich habe ist, dass wenn Benutzer Räume mit den gleichen Namen erstellen, Daten überschrieben werden.Firebase Javascript: Callback-Funktion gibt nichts zurück

Ich habe versucht, jeden einzelnen Raum durchzugehen und zu prüfen, ob der eingegebene Raum mit dem Raumnamen übereinstimmt, den der Benutzer erstellt hat. Das Problem dabei ist, dass ich Daten nur asynchron bekommen kann. Ich habe versucht, eine Callback-Funktion zu implementieren, um die Variable zu aktualisieren, aber das scheint nicht zu funktionieren, weil mein Alarmbefehl nicht funktioniert.

Javascript/JQuery:

var roomName = $.trim(document.getElementById("roomname").value.toLowerCase()); 

var duplicate = function(roomname) { 
    var found = false; 
    roomsRef.on("child_added", function(snapshot) { 
    if (found == roomname) { 
     found = true; 
    } 
    }); 
} 

duplicate(roomName, function(found) { 
    alert(found); // State whether it's a duplicate room or not. 
}); 

Datenbankstruktur:

rooms 
    -all 
    -algorithms 
    -boxing 
    -javascript 
    -money 

Antwort

2

Es gibt einige ganz kleine Fehler in Ihrem Code. Dies sollte besser funktionieren:

var roomName = $.trim(document.getElementById("roomname").value.toLowerCase()); 

var duplicate = function(roomname, callback) { 
    var found = false; 
    roomsRef.on("child_added", function(snapshot) { 
    if (snapshot.key == roomname) { 
     found = true; 
     callback(snapshot.val()) 
    } 
    }); 
} 

duplicate(roomName, function(found) { 
    alert(found); // State whether it's a duplicate room or not. 
}); 

Die Änderungen:

  • Sie einen Rückruf in duplicate(roomName, function(found) { passieren ... Aber Ihre Implementierung von duplicate erklärt nie oder verwendet diesen Rückruf. Ich habe einen Parameter für den Rückruf hinzugefügt und rufe ihn dann auf, wenn der Raum gefunden wurde.
  • Vergleichen Sie die boolean mit der Zeichenfolge roomname erhalten Sie aus dem Textelement. Dieser Vergleich wird niemals wahr sein. Wahrscheinlich möchten Sie den Wert aus der Datenbank mit roomname vergleichen. Mein Code tut das, obwohl ich nicht sicher bin, ob snapshot.key für Ihre Datenstruktur korrekt ist.

Aber dieser Code ist immer noch verschwenderisch. Sie müssen nicht auf alle Räume hören, um zu wissen, ob ein bestimmter existiert. Sie müssen nur nach diesem suchen. Dies kann mit einem einfachen Lesevorgang von nur einem Standort durchgeführt werden:

var duplicate = function(roomname, callback) { 
    var found = false; 
    roomsRef.child(roomname).once("value", function(snapshot) { 
    if (snapshot.exists()) { 
     found = true; 
     callback(snapshot.val()) 
    } 
    }); 
} 
+0

Vielen Dank! Das hat perfekt funktioniert. – Vaporeon