Оператор 'vs' від '


153

Це єдина відмінність між Observable.ofі Observable.fromформат аргументів? Як Function.prototype.callі Function.prototype.apply?

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

Відповіді:


115

Не зовсім. При передачі масиву до Observable.from, єдина різниця між ним і Observable.ofспосіб передачі аргументів.

Однак Observable.fromприйме аргумент, який є

об'єкт, що підписується, Обіцянка, Спосіб, що спостерігається, Масив, Ітерабельний або масив, подібний до об'єкта, який потрібно перетворити

Немає подібної поведінки для Observable.of- яка завжди приймає лише значення та не здійснює перетворення.


193

Важливо відзначити різницю між ofта fromпри передачі структури, схожої на масив (включаючи рядки):

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

видав би відразу весь масив.

З іншої сторони,

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

друкує елементи 1 на 1.

Для рядків поведінка однакова, але на рівні символів.


Що робити, якщо Observable.of (1, 2, 3) .subscribe (x => console.log (x));
xiaoke

1
@xiaoke Тоді, безумовно, це 3 окремі викиди (1, потім 2, потім 3).
Цветан Оведенський

16

Ще один цікавий факт - Observable.of ([]) буде порожнім масивом, коли ви підписуєтесь на нього. Де, як підписуючись на Observable.from ([]), ви не отримаєте жодного значення.

Це важливо, коли ви робите послідовну операцію з комутацією.

Наприклад: У наведеному нижче прикладі я зберігаю роботу, а потім веб-сайти, а потім коментую як потік.

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

якщо немає сайту для збереження, тобто; data.length = 0 в розділі addSite, наведений вище код повертає Observable.of ([]) і переходить до збереження коментарів. Але якщо замінити його на Observable.from ([]), наступні методи не будуть викликані.

rxfiddle


6

Різниця в одному рядку:

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

від : Випромінюйте елементи по одному з масиву. Наприклад

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

з : Випромініть одразу весь масив. Наприклад

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

Примітка: від оператора може вести себе , як від оператора з оператором спреда

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


0

from: Створення спостережуваних із масиву, обіцянок чи ітерабелів. Приймає лише одне значення. Для масивів, ітерабелів та рядків всі містяться значення викидатимуться як послідовність

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

of: Створення спостережуваних із змінними величинами значень, випромінювання значень послідовно, але масиви як єдине значення

const values = [1, 2, 3];
of(values, 'hi', 4, 5); // [1, 2, 3] ... 'hi' ... 4 ... 5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.