Fragen Sie sich nur, was Unterschiede zwischen Observable.combineLatest
und sind Observable.forkJoin
. Soweit ich sehen kann, besteht der einzige Unterschied darin, forkJoin
dass erwartet wird, dass die Observables abgeschlossen sind, während combineLatest
die neuesten Werte zurückgegeben werden.
84
combineLatest()
undforkJoin()
Funktionen , die eine beobachtbare erstellen. Sie machen dasselbe, aber die Syntax ist unterschiedlich. Verwechseln Sie nicht,combineLatest
vonrxjs/operators
welchem ein "pipeable" Operator ist. Wenn Sie den falschen importieren, werden Fehler angezeigt.Antworten:
Es müssen nicht nur
forkJoin
alle Eingabe-Observablen ausgefüllt werden, sondern es wird auch eine Observable zurückgegeben, die einen einzelnen Wert erzeugt, der ein Array der letzten von den Eingabe-Observablen erzeugten Werte ist. Mit anderen Worten, es wartet, bis die letzte beobachtbare Eingabe abgeschlossen ist, und erzeugt dann einen einzelnen Wert und wird abgeschlossen.Im Gegensatz dazu wird
combineLatest
ein Observable zurückgegeben, das jedes Mal einen neuen Wert erzeugt, wenn die eingegebenen Observablen dies tun, sobald alle eingegebenen Observablen mindestens einen Wert erzeugt haben. Dies bedeutet, dass es unendlich viele Werte haben kann und möglicherweise nicht vollständig ist. Dies bedeutet auch, dass die eingegebenen Observablen nicht vervollständigt werden müssen, bevor ein Wert erzeugt wird.quelle
.catch()
,.onErrorResumeNext()
und möglicherweise.retry()
(wenn der HTTP-Aufruf zeitweise fehlschlägt).combineLatest()
können Sie eine Projektionsfunktion angeben, um anzugeben, wie ein Ausgabewert aus den neuesten Werten aus den Eingabe-Observablen erzeugt werden soll. Wenn Sie keinen angeben, erhalten Sie standardmäßig ein Array der zuletzt ausgegebenen Werte.Ebenfalls:
combinLatest (...) führt Observables nacheinander aus
combineLatest
intern verwendetconcat
, was bedeutet, dass für jede im Array beobachtbare Größe ein Wert ermittelt werden muss, bevor mit der nächsten fortgefahren werden kann.forkJoin (...) führt gleichzeitig Observables parallel aus
Wenn Sie 3 Observable-Quellen haben und deren Ausführung jeweils 5 Sekunden dauert, dauert die Ausführung 15 Sekunden
combineLatest
. WährendforkJoin
sie parallel ausgeführt werden, dauert es 5 Sekunden.Funktioniert also
forkJoin
eher dort,Promise.all(...)
wo die Reihenfolge nicht durchgesetzt wird.Überlegungen zur Fehlerbehandlung:
Wenn eines der Observablen fehlerhaft ist - mit
combineLatest
den folgenden wird es nicht ausgeführt, aber mitforkJoin
ihnen laufen alle. SocombineLatest
kann nützlich sein , eine ‚Folge‘ von Observablen auszuführen und alle zusammen das Ergebnis zu sammeln.Erweiterter Hinweis: Wenn die Quell-Observables bereits ausgeführt werden (von etwas anderem abonniert) und Sie
share
sie verwenden, wird dieses Verhalten nicht angezeigt.Noch weiter fortgeschrittener Hinweis: CombineLatest gibt Ihnen immer das Neueste aus jeder Quelle. Wenn also eine der beobachtbaren Quellen mehrere Werte ausgibt, erhalten Sie das Neueste. Es wird nicht nur ein einzelner Wert für jede Quelle abgerufen und zur nächsten übergegangen. Wenn Sie sicherstellen müssen, dass Sie nur das nächste verfügbare Element für jede beobachtbare Quelle erhalten, können Sie
.pipe(take(1))
die beobachtbare Quelle hinzufügen , während Sie sie dem Eingabearray hinzufügen.quelle
concat()
dercombineLatest()
Code tut. Es sieht für mich nach derArray.prototype.concat
Methode aus, nicht nach der RxJS-concat
Methode. Angenommen, ich habe Recht, dann ist diese Antwort irreführend und falsch, dacombineLatest()
Observable nicht einzeln nacheinander ausgeführt werden. Es führt sie parallel aus, genauso wieforkJoin()
. Der Unterschied besteht darin, wie viele Werte erzeugt werden und ob die beobachtbaren Quellen vervollständigt werden müssen oder nicht.[source].concat(observables)
Angenommen, das haben Sie gemeint, als Sie sagten, dass "combineLatest
intern verwendetconcat
". Mir scheint, Sie verwechseln Array Concat mit RxJS Concat. Letzterer führt die eingegebenen Observablen tatsächlich nacheinander aus und wartet, bis alle abgeschlossen sind. Dies wird jedoch nicht voncombineLatest()
einem separaten Operator verwendet.combineLatest()
undforkJoin()
beide laufen parallel. Wenn Sie den folgenden Code ausführen, werden für beide ungefähr 5000 ausgegeben.const start = new Date().getTime();
combineLatest([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
forkJoin - Wenn alle Observablen abgeschlossen sind, geben Sie jeweils den zuletzt ausgegebenen Wert aus.
combinLatest - Wenn ein Observable einen Wert ausgibt , geben Sie jeweils den neuesten Wert aus.
Die Verwendung ist ziemlich ähnlich, aber Sie sollten nicht vergessen, sich im Gegensatz zu forkJoin von combinLatest abzumelden .
quelle