Operator „z” vs „from”

153

Czy jedyna różnica między Observable.ofi Observable.fromformat argumenty? Podobnie jak Function.prototype.calli Function.prototype.apply?

Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
xiaoke
źródło

Odpowiedzi:

115

Nie do końca. Podczas przekazywania tablicy do Observable.fromjedyną różnicą między nią a Observable.ofsposobem przekazywania argumentów.

Jednak Observable.fromprzyjmie 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.

Cartant
źródło
193

Ważne jest, aby zwrócić uwagę na różnicę między ofi frompodczas 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.

Tsvetan Ovedenski
źródło
Co jeśli Observable.of (1, 2, 3) .subscribe (x => console.log (x));
xiaoke,
1
@xiaoke Zatem na pewno są to 3 oddzielne emisje (1, potem 2, potem 3).
Tsvetan Ovedenski
16

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.

rxfiddle

Josf
źródło
6

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'
M Abdullah
źródło
0

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
Bjarne Gerhardt-Pedersen
źródło