2016-08-16 3 views
1

Ich habe eine Funktion in js, die aktualisiert werden muss, nachdem ich Daten von Firebase abgerufen habe.Firebase-Skript nach dem Abrufen vorhandener Daten

firebase.database().ref('/users/' + this.userId + '/info').on('child_added', function(snapshot){ 
    this.myFunction(); 
}.bind(this)); 

Das Problem ist, dass die Daten in Firebase sehr groß ist, so tun, was ich nicht die Funktion viele Male ausgeführt werden. So kann ich es ausführen:

  1. Abrufen aller vorhandenen Daten aus Firebase.
  2. Führen Sie die Funktion (einmal) aus.
  3. Jedes Mal, wenn mehr Daten von Firebase eingehen, führen Sie die Funktion erneut aus.

Ist das möglich?

Danke.

Antwort

1

Yevgens Antwort ist eine Möglichkeit, dies zu tun. Aber es bedeutet, dass Sie alle Kinder bei jeder Änderung verarbeiten, was möglicherweise nicht das ist, was Sie wollen.

Eine Alternative besteht darin, die ersten untergeordneten Objekte unter Verwendung eines value-Ereignisses und dann die nachfolgenden Änderungen mit child_-Ereignissen zu verarbeiten. Sie können die Garantie verwenden, dass das Ereignis value nach allen zugehörigen child_-Ereignissen ausgelöst wird, um festzustellen, ob die anfängliche Nutzlast ausgeführt wurde.

var isInitialValueDone = false 

ref.once('value', function(snapshot) { 
    snapshot.forEach(function(child) { 
    console.log('Do something with '+child.key); 
    }); 
    isInitialValueDone = true; 
}); 
ref.on('child_added', function(snapshot) { 
    if (isInitialValueDone) { 
    console.log('Do something with '+snapshot.key); 
    } 
}); 
+0

Nur die erste 'on' auf 'once' geändert . Mit Ihrer Antwort muss ich mein Datenlayout nicht neu strukturieren. –

+0

Autsch ... guter Punkt über das 'once()'. Ich habe meine Antwort aktualisiert. –

0

Ich vermute, dass Sie alle vorhandenen Daten von Firebase auf einmal abrufen möchten, sobald mehr Daten eintreffen, hören Sie auf diese Datenänderungen. Wenn das der Fall ist, schau dir die Methode einmal an() in Firebase

+0

ja, aber ich brauche eine 'on' Funktion, nachdem das einmal beendet ist. wie mache ich das? –

2

Ja, das ist möglich. Zuerst müssen Sie ref Parameter leer lassen, so erhalten Sie alle Informationen von Root-Knoten (alle Ihre Daten). Es wird zum ersten Mal ausgelöst, wenn es standardmäßig ausgeführt wird und wird bei jeder Datenänderung aufgrund des Parameters 'value' erneut ausgelöst. Anstelle von Ihnen können Sie child_added, child_changed, child_removed oder child_moved verwenden, um die Häufigkeit des Datenempfangs von Firebase zu reduzieren. Beispiel:

firebase.database().ref().on('value', function(snapshot){ 
    myFunction(snapshot.val()); 
}; 

P.S. Vergessen Sie nicht, die Daten aus dem Snapshot mit snapshot.val() zu ermitteln.

+0

Ich mag das, es ist kreativ. also kann ich meinen Knoten in einen anderen setzen, so: firebase.database(). ref ('/ users /' + this.userId + '/ main/info') –

Verwandte Themen