Firebase empfängt keine Daten, bevor die Ansicht geladen wurde - leeres Array wurde vor dem Füllen zurückgegeben

8

Im folgenden Code speichere ich den Schlüssel und die E-Mail-Adresse jedes Elements in einer Tabelle und lade das Objekt, das mit dem Schlüssel aus der ursprünglichen Tabelle abgerufen werden soll, ab. Ich kann sehen, dass die Elemente in das Array rawList gestellt werden, wenn ich console.log, aber die Funktion gibt this.cartList zurück, bevor es etwas darin hat, so dass die Ansicht keine der Daten erhält. Wie kann ich es so einrichten, dass this.cartList darauf wartet, dass rawList voll ist, bevor es zurückgegeben wird?

%Vor%

Ich habe versucht, die this.cartList = rawList an einer Reihe von verschiedenen Stellen (vor return false , sogar innerhalb der .then -Anweisung) zu setzen, aber das hat das Problem nicht gelöst.

    
maudulus 09.05.2017, 19:21
quelle

4 Antworten

1
___ answer44002513 ___

Da Sie angular verwenden, sollten Sie auch rawList verwenden, was snapshot2.val() verwendet, wodurch dieses Problem für Sie gelöst wird. Sie werden immer noch das normale SDK für viele Dinge verwenden, aber zum Abrufen und Binden von Daten wird es nicht empfohlen, Firebase alleine ohne %code% zu benutzen, da es diese Dinge weniger überschaubar macht.

Das Schöne an diesem Ansatz ist, dass Sie beliebige Methoden für %code% wie %code% , %code% , %code% usw. nutzen können.

Nach der Installation einfach tun:

%Vor%

Und in der Ansicht:

%Vor%

Um zu warten, bis die Daten angezeigt werden.

    
___ qstnhdr ___ Firebase empfängt keine Daten, bevor die Ansicht geladen wurde - leeres Array wurde vor dem Füllen zurückgegeben ___ answer43987803 ___

Das Problem ist der Promise (async .once () -Aufruf an Firebase) innerhalb der forEach-Schleife (sync). Die forEach-Schleife wartet nicht auf die then () -Anweisung, so dass bei der nächsten Iteration die Daten der vorherigen Iteration einfach verloren gehen ...

%Vor%

Sie müssen forEach die gesamte Promise in die rawList schieben und dann darauf warten, dass sie aufgelöst werden und mit den Ergebnissen etwas tun.

%Vor%

Die Sache ist, es ist immer noch ein bisschen peinlich, diese.cartList = Promise.all (rawList) zuzuweisen, da sie es zu einem Versprechen macht. Vielleicht möchten Sie Ihr Design überdenken und etwas wie einen getCartList Service machen? (nicht wissen, wie deine App ist: p)

    
___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ tag123angular ___ Fragen zu Angular, dem Web-Framework von Google. Verwenden Sie dieses Tag für Angular-Fragen, die nicht für eine einzelne Version spezifisch sind. Verwenden Sie für das ältere AngularJS-Webframework (1.x) das angularjs-Tag. ___ tag123firebase ___ Firebase ist eine serverlose Plattform für die einheitliche Entwicklung von Anwendungen für mobile Geräte und für das Web. ___ antwort43940900 ___

Der folgende Funktionsaufruf ist asynchron und Sie verlieren den Gültigkeitsbereich, bevor %code% eine Chance zum Aktualisieren hat, da dieser Datenbankaufruf eine ziemlich lange Zeit benötigt:

%Vor%

Sie schieben den Schnappschuss auch direkt in diese Liste, wenn Sie %code% drücken sollten, um den Rohwert zu erhalten.

So würde ich Ihren Code reparieren:

%Vor%     
___ tag123firebasedatabase ___ Firebase Realtime Database ist eine Cloud-gehostete NoSQL-JSON-Datenbank, die Offline-Caching und -Synchronisierung ermöglicht. Verwenden Sie dieses Tag NICHT für Fragen zu Cloud Firestore. Verwenden Sie stattdessen [tag: google-cloud-firestore]. ___ answer44030971 ___

Verwenden Sie AngularFire2 und RxJS Dies spart Ihnen viel Zeit und Sie werden es in der richtigen und wartbaren Weise tun, indem Sie die RxJS-Operatoren verwenden. Hier können Sie mehr über diese Operatoren erfahren learnrxjs

    
___ tag123callback ___ Ein Callback ist ein Stück Code (dh die Adresse oder Referenz einer Funktion oder Methode oder ein Lambda-Ausdruck), die als Argument an anderen Code übergeben wird, von dem erwartet wird, dass er das Argument zu einem geeigneten Zeitpunkt zurückführt (ausführt) Zeit. Dieses Tag sollte bei Fragen zu einer API verwendet werden, die Callbacks verwendet, um den Aufrufer zu benachrichtigen, wenn eine Aktion abgeschlossen ist. Verwenden Sie das Event-Handling-Tag für Fragen zum Abonnieren von Ereignissen, z. B. in einem GUI-Framework. ___ qstntxt ___

Im folgenden Code speichere ich den Schlüssel und die E-Mail-Adresse jedes Elements in einer Tabelle und lade das Objekt, das mit dem Schlüssel aus der ursprünglichen Tabelle abgerufen werden soll, ab. Ich kann sehen, dass die Elemente in das Array %code% gestellt werden, wenn ich console.log, aber die Funktion gibt %code% zurück, bevor es etwas darin hat, so dass die Ansicht keine der Daten erhält. Wie kann ich es so einrichten, dass %code% darauf wartet, dass %code% voll ist, bevor es zurückgegeben wird?

%Vor%

Ich habe versucht, die this.cartList = rawList an einer Reihe von verschiedenen Stellen (vor %code% , sogar innerhalb der %code% -Anweisung) zu setzen, aber das hat das Problem nicht gelöst.

    
___
Bradley Mackey 12.05.2017 15:03
quelle
1

Das Problem ist der Promise (async .once () -Aufruf an Firebase) innerhalb der forEach-Schleife (sync). Die forEach-Schleife wartet nicht auf die then () -Anweisung, so dass bei der nächsten Iteration die Daten der vorherigen Iteration einfach verloren gehen ...

%Vor%

Sie müssen forEach die gesamte Promise in die rawList schieben und dann darauf warten, dass sie aufgelöst werden und mit den Ergebnissen etwas tun.

%Vor%

Die Sache ist, es ist immer noch ein bisschen peinlich, diese.cartList = Promise.all (rawList) zuzuweisen, da sie es zu einem Versprechen macht. Vielleicht möchten Sie Ihr Design überdenken und etwas wie einen getCartList Service machen? (nicht wissen, wie deine App ist: p)

    
louisvno 15.05.2017 19:58
quelle
1

Da Sie angular verwenden, sollten Sie auch angularfire2 verwenden, was Observables verwendet, wodurch dieses Problem für Sie gelöst wird. Sie werden immer noch das normale SDK für viele Dinge verwenden, aber zum Abrufen und Binden von Daten wird es nicht empfohlen, Firebase alleine ohne angularfire2 zu benutzen, da es diese Dinge weniger überschaubar macht.

Das Schöne an diesem Ansatz ist, dass Sie beliebige Methoden für Observable wie filter , first , map usw. nutzen können.

Nach der Installation einfach tun:

%Vor%

Und in der Ansicht:

%Vor%

Um zu warten, bis die Daten angezeigt werden.

    
Chrillewoodz 16.05.2017 13:12
quelle
0

Verwenden Sie AngularFire2 und RxJS Dies spart Ihnen viel Zeit und Sie werden es in der richtigen und wartbaren Weise tun, indem Sie die RxJS-Operatoren verwenden. Hier können Sie mehr über diese Operatoren erfahren learnrxjs

    
Fernando lugo 17.05.2017 17:05
quelle