Beobachtbar ist.forkJoin() nicht ausgeführt wird
Ich habe den folgenden code:
//Loop: For each user ID/Role ID, get the data
userMeta.forEach((businessRole) => {
Observable.forkJoin(
af.database.object('/roles/'+businessRole.$value),
af.database.object('/users/'+businessRole.$key)
).subscribe(
data => {
console.log("Data received");
data[1].role = data[0];
this.users.push(data[1]);
},
err => console.error(err)
);
Ich versuche zu abonnieren, die zu einem Ergebnis von 2 observablen mit forkJoin
.
Einige Gründe, die "Daten empfangen" - Meldung wird nicht angezeigt.
Meine userMeta
Variablen sieht gut aus in der Konsole.log:
Was ist falsch?
Update: der folgende code nichts zurück entweder
let source = Observable.forkJoin(
af.database.object('/roles/'+businessRole.$value),
af.database.object('/users/'+businessRole.$key)
);
let subscription = source.subscribe(
function (x) {
console.log("GOT: " + x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
Was ich eigentlich versuche zu tun, ist der performance-Verbesserung der folgenden code:
//Subscription 3: role ID to role Name
af.database.object('/roles/'+businessRole.$value)
.subscribe((roleData) => {
//Subscription 4: Get user info
af.database.object('/users/'+businessRole.$key).subscribe(user => {
forkJoin()
emittiert, ein Wert, nachdem die beiden Observablen vollständig, so sind Sie sicher, dass Sie tun? Vielleicht einer von Ihnen am Ende mit einem Fehler...- Keine Fehler zu (siehe update). Sie müssen auch arbeiten, da der bisherige code war eine subscribe-innen abonnieren, und es funktionierte
forkJoin()
übergeben nicht Fehler von der Quelle Observablen so wird dies nicht alles drucken, auch wenn es Fehler warf. Wenn Sie wollen, um sicherzustellen, dass es nicht emittieren Fehler, die Sie benötigen, zu abonnieren, um jeweils die Quelle Observablen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
forkJoin()
verlangt, dass alle Quell-Observablen zu emittieren, die mindestens einmal und zu vervollständigen.Diese folgenden demo abgeschlossen ist, als erwartet:
Live-demo: https://stackblitz.com/edit/rxjs-urhkni
Jan 2019: Aktualisiert für RxJS 6
forkJoin()
. Es ist wirklich merkwürdig...forkJoin()
..subscribe((roleData) => {...
sendet einen Wert an jedennext
nennen.forkJoin()
. forkJoin() erfordert, dass beide Observablen zu vervollständigen. sonst wird es nicht ausgegeben, nichts.forkJoin()
. Denn Ihre Antwort ist corrcet, ich werde es genehmigen, und öffnen Sie eine neue Frage zu meinem FallObservable.combineLatest()
könnte das sein, was du suchst @TheUnreal.forkJoin
die details dercomplete
Methode, great stuffIch hatte ein ähnliches Problem mit Winkel-2 /Angularfire 2, speziell, wo ich war auf der Suche, ob der Benutzer existiert per E-Mail. In einem Fall, der user existiert und ich erhielt ein array von einem Objekt aus dem Beobachtbaren. Im anderen Fall, wird der Benutzer nicht existieren, und ich erhielt ein leeres array.
Wenn ich forkJoin mit Namen "resultselector" und abonnieren, die weder den Namen "resultselector" noch die " abonnieren-Funktion jemals lief. Allerdings, wenn ich versuchte
Sowohl die Wähler und die abonnieren gearbeitet. Ich nehme an, dies hat zu tun mit @martin die Antwort, wo forkJoin erfordert die observablen zu vervollständigen, weil es per definition gibt die die letzten - Emissionen. Wenn eine beobachtbare nie abgeschlossen, ich denke es kann nie ein letzten emission.
Vielleicht angularfire Liste observablen (oder Objekt observablen in Ihrem Fall) nicht abgeschlossen, so dass die Verwendung von forkJoin unmöglich. Glücklicherweise zip hat ähnliche Verhalten und funktioniert immer noch, mit dem Unterschied, dass es mehrmals wiederholen, wenn die änderungen der Daten in FB, wo, wie forkJoin nur verbindet der letzten Antwort.
In meinem Fall, ich bin auf der Suche entweder 1) mit Reißverschluss und akzeptieren, dass mein code kann mehrmals ausgeführt werden, wenn der Benutzer Daten ändert, während die .zip läuft noch, 2) manuell deaktivieren Sie die zip nach dem ersten Satz von Daten gibt, oder 3) Graben Angularfire und versuchen, die FB-api direkt, mit so etwas wie .mal sehen, ob ich bekommen kann, eine beobachtbare abgeschlossen und löst forkJoin.
Observable.combineLatest
stattObservable.forkJoin
. Credits gehen an github.com/angular/angularfire2/issues/617Ich habe vor ein ähnliches Problem: ich habe eine Liste von observablen dynamisch und ich habe bemerkt, dass
forkjoin()
nie strahlt noch vervollständigt, wenn die Liste der observablen ist leer, in der Erwägung, dassPromise.all()
löst mit einer leeren Liste :Den workaround den ich gefunden habe, ist überprüfen Sie die Länge der Liste und nicht verwenden Sie diesen operator, wenn es leer ist.
Fügen Sie einfach Beobachter.complete();
Wird nicht funktionieren:
Arbeiten:
Hoffe, es hilft.