'of' vs 'from' оператор


154

Это единственное различие между 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примет аргумент, который

подписываемый объект, Promise, Observable-подобный, Array, итерируемый или похожий на массив объект для преобразования

Нет аналогичного поведения для 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));
Сяоке

1
@xiaoke Тогда, конечно, это 3 отдельных выброса (1, затем 2, затем 3).
Цветан Оведенский,

16

Еще один интересный факт - Observable.of ([]) будет пустым массивом, когда вы подписываетесь на него. Где, когда вы подписываетесь на Observable.from ([]), вы не получите никакого значения.

Это важно, когда вы выполняете последовательную операцию с switchmap.

Пример: В приведенном ниже примере я сохраняю работу, а затем сайты, а затем комментарии в виде потока.

.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 : испускать элементы один за другим из массива. Например

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

of : испустить весь массив одновременно. Например

 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.