Observable.forkJoin () wird nicht ausgeführt

7

Ich habe den folgenden Code:

%Vor%

Ich versuche, ein Ergebnis von zwei Observablen mit forkJoin zu subskribieren.

Aus irgendeinem Grund wird die Meldung "Daten empfangen" nicht angezeigt.

Meine userMeta Variablen sehen in console.log gut aus:

Was ist los?

Update: Der folgende Code gibt auch nichts zurück

%Vor%

Was ich eigentlich versuche, ist die Performance des folgenden Codes zu verbessern:

%Vor%     
TheUnreal 28.10.2016, 10:19
quelle

3 Antworten

6

forkJoin() benötigt beide Observables abschließen .

Die folgende Demo wird wie erwartet abgeschlossen:

%Vor%     
martin 28.10.2016, 19:05
quelle
10

Ich hatte ein ähnliches Problem mit Angular 2 / Angularfire 2, speziell wo ich nachgesehen habe, ob Benutzer per E-Mail existierten. In einem Fall existiert der Benutzer und ich habe ein Array von einem Objekt vom Observable erhalten. Im anderen Fall existierte der Benutzer nicht und ich erhielt ein leeres Array.

Wenn ich forkJoin mit einem resultSelector und einem subscribe verwendet habe, wurde weder der resultSelector noch die subscribe-Funktion ausgeführt. Allerdings, als ich es versuchte

%Vor%

Sowohl der Selektor als auch der Abonnent haben funktioniert. Ich nehme an, dies hat mit @ Martins Antwort zu tun, wo forkJoin erfordert, dass die Observables abgeschlossen werden, weil per definitionem die letzten Emissionen zurückgegeben werden. Wenn ein beobachtbares Objekt niemals vollständig ist, kann es vermutlich niemals eine letzte Emission haben.

Vielleicht werden die Observablen von anglefire-Listen (oder Objektobservablen in Ihrem Fall) niemals vollständig, was die Verwendung von forkJoin unmöglich macht. Glücklicherweise hat zip ein ähnliches Verhalten und funktioniert immer noch, mit dem Unterschied, dass es mehrmals wiederholt werden kann, wenn sich die Daten in Firebase ändern, wobei forkJoin nur die letzte Antwort kombiniert.

In meinem Fall sehe ich entweder 1) mit zip und akzeptiere, dass mein Code mehrmals ausgeführt wird, wenn sich Benutzerdaten ändern, während die .zip noch läuft, 2) manuell die Zip nach dem ersten Datensatz deaktivieren returns, oder 3) winkle Angularfire und probiere die Firebase api direkt aus und benutze etwas wie .once, um zu sehen, ob ich eine Observable erhalten kann, die forkJoin vervollständigt und auslöst.

    
ansorensen 15.02.2017 08:11
quelle
7

Ich hatte ein ähnliches Problem: Ich habe eine Liste von Observablen dynamisch erstellt und festgestellt, dass forkjoin() weder emittiert noch vervollständigt wird, wenn die Liste der Observables leer ist, während Promise.all() mit einer leeren Liste aufgelöst wird:

%Vor%

Die von mir gefundene Problemumgehung besteht darin, die Länge der Liste zu überprüfen und diesen Operator nicht zu verwenden, wenn er leer ist.

%Vor%     
bgondy 06.03.2017 10:18
quelle