Answers:
重要的是要注意of
和from
传递类似数组的结构(包括字符串)之间的区别:
Observable.of([1, 2, 3]).subscribe(x => console.log(x));
将立即打印整个数组。
另一方面,
Observable.from([1, 2, 3]).subscribe(x => console.log(x));
按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())
....
如果没有要保存的站点,即;在addSite部分中data.length = 0时,上面的代码返回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 运算符的行为可以像来自具有散布运算符的运算符一样
of(...fruits).subscribe(console.log) // 'orange','apple','banana'
https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100
from
:从数组,promise或iterable创建可观察的对象。仅取一个值。对于数组,可迭代对象和字符串,所有包含的值将作为序列发出
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