Подтвердить что ты не робот

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

Единственное различие между форматами аргументов Observable.of и Observable.from? Подобно Function.prototype.call и Function.prototype.apply?

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

Ответ 1

Не совсем. При передаче массива в Observable.from единственное различие между ним и Observable.of - это способ передачи аргументов.

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

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

Не существует подобного поведения для Observable.of - который всегда принимает только значения и не выполняет преобразование.

Ответ 2

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

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

будет печатать весь массив сразу.

С другой стороны,

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

печатает элементы 1 на 1.

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

Ответ 3

Еще один интересный факт - 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