回答:
違いに注意することが重要である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())
....
保存するサイトがない場合、つまり addSiteセクションのdata.length = 0、上記のコードはObservable.of([])を返し、コメントを保存します。ただし、Observable.from([])で置き換えると、後続のメソッドは呼び出されません。
1行の違い:
let fruits = ['orange','apple','banana']
from:配列のアイテムを1つずつ放出します。例えば
from(fruits).subscribe(console.log) // 'orange','apple','banana'
of:配列全体を一度に放出します。例えば
of(fruits).subscribe(console.log) // ['orange','apple','banana']
注: of オペレーターは、spreadオペレーターを持つオペレーターからのように動作できます。
of(...fruits).subscribe(console.log) // 'orange','apple','banana'
https://stackblitz.com/edit/typescript-sckwsw?file=index.ts&devtoolsheight=100
from
:配列、promiseまたはiterableからオブザーバブルを作成します。値は1つだけです。配列、イテラブル、文字列の場合、含まれるすべての値はシーケンスとして出力されます
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