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(() => {})

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.


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.


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


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'


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.