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に似たオブジェクト、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())
....
addSiteセクションでdata.length = 0の場合、上記のコードはObservable.of([])を返してからコメントの保存に進みます。しかし、Observable.from([])に置き換えた場合、後続のメソッドは呼び出されません。