Ответы:
Не совсем. При передаче массива Observable.from
, единственная разница между ним и Observable.of
способом передачи аргументов.
Тем не менее, Observable.from
примет аргумент, который
подписываемый объект, Promise, Observable-подобный, 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 ([]), последующие методы не будут вызваны.
Разница в одну строку:
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'
https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100
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