2016-03-18 1 views
0

Ich habe eine Chat-Anwendung, in der Nachrichten in einer Firebase-Sammlung gespeichert werden.Endlosschleife mit Firebase.on ('child_added')

Es ist ein Browser-Client, der für die ‚child_added‘ Ereignis auf der Sammlung hört:

const chatRef = new Firebase() 

chatRef.on('child_added', function(snapshot) { //... }) 

Ich habe auch einen Server-Client, der für das gleiche Ereignis auf der gleichen Kollektion hört. Wenn der Server-Client sieht, dass eine Nachricht zu der Sammlung hinzugefügt wurde, um ein Rückruf Feuer die Nachricht zu verarbeiten, und drücken Sie die Sammlung eine neue Nachricht in:

const chatRef = new Firebase() 

chatRef.on('child_added', function(snapshot) { 
    const outgoingMessage = processIncomingMessage(snapshot.val()) 
    chatRef.push(outgoingMessage) 
}) 

Dies führt zu einer Endlosschleife, da der Server nun versuchen wird, um Nachrichten zu verarbeiten, die der Sammlung in Firebase hinzugefügt wurden.

Gibt es eine Möglichkeit, dies zu vermeiden? Ich denke, ich muss meine Daten in Firebase restrukturieren, aber ich bin mir nicht sicher, wie das aussehen soll.

Antwort

0

Es gibt viele Möglichkeiten, es zu entfernen. Aber es hängt wirklich davon ab, wie Sie das funktionieren wollen.

Eine Möglichkeit besteht darin, dass der Server Nachrichten ignorieren kann, die er selbst gesendet hat.

Um dies zu tun, würden Sie eine Liste haben, die Sie senden die Push-ID von irgendwelchen Einzelteilen hält:

var pendingKeys = []; 

Dann, wenn Sie eine Nachricht senden, Sie seine Push-ID zu dieser Liste hinzuzufügen:

var newRef = chatRef.push(); 
pendingKeys.push(newRef.key); 
newRef.set(outgoingMessage); 

Nun, wenn Sie einen child_added erhalten, ignorieren Sie die Nachricht, wenn es in der Liste der anstehenden Schlüssel ist.

chatRef.on('child_added', function(snapshot) { 
    var index = pendingKeys.indexOf(snapshot.key()); 
    if (index >= 0) { 
    const outgoingMessage = processIncomingMessage(snapshot.val()) 
    chatRef.push(outgoingMessage) 
    } 
    else { 
    pendingKeys.splice(index,1); 
    } 
}) 

Sie werden bemerken, dass ich auch ein splice() verwenden den Schlüssel aus der Liste an dieser Stelle zu entfernen, da sonst die Liste auf unbestimmte Zeit halten würde wachsen.