Odpowiedzi:
Nie do końca. Podczas przekazywania tablicy do Observable.from
jedyną różnicą między nią a Observable.of
sposobem przekazywania argumentów.
Jednak Observable.from
przyjmie argument, który jest
obiekt, który można subskrybować, obietnicę, obiekt podobny do obserwowalnego, tablicę, obiekt iterowalny lub obiekt podobny do tablicy do konwersji
Nie ma podobnego zachowania dla Observable.of
- który zawsze akceptuje tylko wartości i nie wykonuje konwersji.
Ważne jest, aby zwrócić uwagę na różnicę między of
i from
podczas przekazywania struktury podobnej do tablicy (w tym ciągów znaków):
Observable.of([1, 2, 3]).subscribe(x => console.log(x));
wypisze całą tablicę naraz.
Z drugiej strony,
Observable.from([1, 2, 3]).subscribe(x => console.log(x));
wypisuje elementy 1 na 1.
W przypadku łańcuchów zachowanie jest takie samo, ale na poziomie znaków.
Innym interesującym faktem jest to, że Observable.of ([]) będzie pustą tablicą, gdy ją zasubskrybujesz. W przypadku gdy subskrybujesz Observable.from ([]), nie otrzymasz żadnej wartości.
Jest to ważne, gdy wykonujesz kolejną operację z przełącznikiem.
Np .: W poniższym przykładzie zapisuję ofertę pracy, a następnie witryny, a następnie komentarze jako strumień.
.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())
....
jeśli nie ma miejsca do zapisania, tj. data.length = 0 w sekcji addSite, powyższy kod zwraca Observable.of ([]), a następnie przechodzi do zapisywania komentarzy. Ale jeśli zastąpisz go Observable.from ([]), kolejne metody nie zostaną wywołane.
Różnica w jednej linii:
let fruits = ['orange','apple','banana']
from : Emituj elementy po kolei z tablicy. Na przykład
from(fruits).subscribe(console.log) // 'orange','apple','banana'
of : Emituj całą tablicę naraz. Na przykład
of(fruits).subscribe(console.log) // ['orange','apple','banana']
UWAGA: od operatora mogą zachowywać się jak od operatora z operatorem spread
of(...fruits).subscribe(console.log) // 'orange','apple','banana'
https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100
from
: Utwórz obserwowalne z tablicy, obietnicy lub iterowalne. Przyjmuje tylko jedną wartość. W przypadku tablic, elementów iteracyjnych i łańcuchów wszystkie zawarte wartości będą emitowane jako sekwencja
const values = [1, 2, 3];
from(values); // 1 ... 2 ... 3
of
: Utwórz obserwowalne ze zmiennymi ilościami wartości, emituj wartości w kolejności, ale tablice jako pojedynczą wartość
const values = [1, 2, 3];
of(values, 'hi', 4, 5); // [1, 2, 3] ... 'hi' ... 4 ... 5