Единственное различие между форматами аргументов Observable.of
и Observable.from
? Подобно Function.prototype.call
и Function.prototype.apply
?
Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
Единственное различие между форматами аргументов Observable.of
и Observable.from
? Подобно Function.prototype.call
и Function.prototype.apply
?
Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
Не совсем. При передаче массива в Observable.from
единственное различие между ним и Observable.of
- это способ передачи аргументов.
Однако Observable.from
примет аргумент, который
подписной объект, Promise, Observable-like, Array, итерируемый или подобный массиву объект, который нужно преобразовать
Не существует подобного поведения для Observable.of
- который всегда принимает только значения и не выполняет преобразование.
Важно отметить разницу между 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([]) будет пустым массивом, когда вы подписываетесь на него. Где, когда вы подписываетесь на 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([]), последующие методы не будут вызваны.