'dari' vs 'dari' operator

153

Apakah satu-satunya perbedaan antara Observable.ofdan Observable.fromformat argumen? Suka Function.prototype.calldan Function.prototype.apply?

Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
Xiaoke
sumber

Jawaban:

115

Tidak terlalu. Saat meneruskan array ke Observable.from, satu-satunya perbedaan antara itu dan Observable.ofcara argumen dilewatkan.

Namun, Observable.fromakan menerima argumen itu

objek yang dapat berlangganan, Janji, objek yang Dapat Diamati, Array, objek yang dapat diubah atau mirip array yang akan dikonversi

Tidak ada perilaku serupa untuk Observable.of- yang selalu hanya menerima nilai dan tidak melakukan konversi.

gerobak
sumber
193

Penting untuk dicatat perbedaan antara ofdan fromketika melewati struktur mirip array (termasuk string):

Observable.of([1, 2, 3]).subscribe(x => console.log(x));

akan mencetak seluruh array sekaligus.

Di samping itu,

Observable.from([1, 2, 3]).subscribe(x => console.log(x));

mencetak elemen 1 dengan 1.

Untuk string, tingkah lakunya sama, tetapi pada level karakter.

Tsvetan Ovedenski
sumber
Bagaimana jika Observable.of (1, 2, 3) .subscribe (x => console.log (x));
xiaoke
1
@xiaoke Maka pasti itu adalah 3 emisi terpisah (1, lalu 2, lalu 3).
Tsvetan Ovedenski
16

Fakta menarik lainnya adalah Observable.of ([]) akan menjadi array kosong ketika Anda berlangganan. Di mana ketika Anda berlangganan Observable.from ([]) Anda tidak akan mendapatkan nilai apa pun.

Ini penting ketika Anda melakukan operasi berurutan dengan switchmap.

Contoh: Dalam contoh di bawah ini, saya menyimpan pekerjaan dan kemudian situs, dan kemudian berkomentar sebagai streaming.

.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())
....

jika tidak ada situs untuk disimpan, yaitu; data.length = 0 di bagian addSite, kode di atas mengembalikan Observable.of ([]) dan kemudian menyimpan komentar. Tetapi jika Anda menggantinya dengan Observable.from ([]), metode selanjutnya tidak akan dipanggil.

rffiddle

Josf
sumber
6

Perbedaan satu baris:

       let fruits = ['orange','apple','banana']

from : Emit item satu per satu dari array. Sebagai contoh

    from(fruits).subscribe(console.log) // 'orange','apple','banana'

dari : Keluarkan seluruh array sekaligus. Sebagai contoh

 of(fruits).subscribe(console.log) //  ['orange','apple','banana']

CATATAN: dari operator dapat berperilaku seperti dari operator dengan spread Operator

 of(...fruits).subscribe(console.log) //  'orange','apple','banana'
M Abdullah
sumber
0

from: Buat diamati dari array, janji atau iterable. Hanya mengambil satu nilai. Untuk array, iterables dan string, semua nilai yang terkandung akan dipancarkan sebagai urutan

const values = [1, 2, 3];
from(values); // 1 ... 2 ... 3

of: Buat nilai-nilai variabel yang dapat diobservasi, keluarkan nilai secara berurutan, tetapi array sebagai nilai tunggal

const values = [1, 2, 3];
of(values, 'hi', 4, 5); // [1, 2, 3] ... 'hi' ... 4 ... 5
Bjarne Gerhardt-Pedersen
sumber