Antworten:
Nicht ganz. Wenn Sie ein Array an übergeben Observable.from
, besteht der einzige Unterschied zwischen ihm und Observable.of
der Art und Weise, wie die Argumente übergeben werden.
Allerdings Observable.from
wird ein annehmen Argument , das ist
ein abonnierbares Objekt, ein Versprechen, ein beobachtbares Objekt, ein Array, ein iterierbares oder ein Array-ähnliches Objekt, das konvertiert werden soll
Es gibt kein ähnliches Verhalten für Observable.of
- das immer nur Werte akzeptiert und keine Konvertierung durchführt.
Es ist wichtig, den Unterschied zwischen of
und from
beim Übergeben einer Array-ähnlichen Struktur (einschließlich Zeichenfolgen) zu beachten :
Observable.of([1, 2, 3]).subscribe(x => console.log(x));
würde das gesamte Array auf einmal drucken.
Andererseits,
Observable.from([1, 2, 3]).subscribe(x => console.log(x));
druckt die Elemente 1 mal 1.
Bei Zeichenfolgen ist das Verhalten dasselbe, jedoch auf Zeichenebene.
Eine weitere interessante Tatsache ist, dass Observable.of ([]) ein leeres Array ist, wenn Sie es abonnieren. Wo wie beim Abonnieren von Observable.from ([]) erhalten Sie keinen Wert.
Dies ist wichtig, wenn Sie eine aufeinanderfolgende Operation mit switchmap ausführen.
Beispiel: Im folgenden Beispiel speichere ich einen Job und dann Websites und kommentiere dann als Stream.
.do((data) => {
this.jobService.save$.next(this.job.id);
})
.switchMap(() => this.jobService.addSites(this.job.id, this.sites)
.flatMap((data) => {
if (data.length > 0) {
// get observables for saving
return Observable.forkJoin(jobSiteObservables);
} else {
**return Observable.of([]);**
}
})).do((result) => {
// ..
})
.switchMap(() => this.saveComments())
....
wenn es keine Site zum Speichern gibt, dh; data.length = 0 im Abschnitt addSite gibt der obige Code Observable.of ([]) zurück und speichert dann Kommentare. Wenn Sie es jedoch durch Observable.from ([]) ersetzen, werden die nachfolgenden Methoden nicht aufgerufen.
Einzeiliger Unterschied:
let fruits = ['orange','apple','banana']
from : Geben Sie die Elemente einzeln im Array aus. Beispielsweise
from(fruits).subscribe(console.log) // 'orange','apple','banana'
of : Das gesamte Array auf einmal ausgeben. Beispielsweise
of(fruits).subscribe(console.log) // ['orange','apple','banana']
HINWEIS: der Bediener kann so verhalten von Operator mit Spread - Operator
of(...fruits).subscribe(console.log) // 'orange','apple','banana'
https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100
from
: Erstellen Sie Observable aus Array, Versprechen oder Iterable. Nimmt nur einen Wert an. Bei Arrays, Iterables und Strings werden alle enthaltenen Werte als Sequenz ausgegeben
const values = [1, 2, 3];
from(values); // 1 ... 2 ... 3
of
: Erstellen Sie Observable mit variablen Mengen an Werten, geben Sie Werte nacheinander aus, aber Arrays als Einzelwert
const values = [1, 2, 3];
of(values, 'hi', 4, 5); // [1, 2, 3] ... 'hi' ... 4 ... 5