web-dev-qa-db-ja.com

からのRxJsオブザーバブル

Observable.ofObservable.fromの唯一の違いは引数の形式ですか? Function.prototype.callFunction.prototype.applyのように?

Observable.of(1,2,3).subscribe(() => {})
Observable.from([1,2,3]).subscribe(() => {})
106
xiaoke

かなりありません。配列をObservable.fromに渡すとき、それがObservable.ofとの唯一の違いは、引数が渡される方法です。

しかしObservable.from引数 を受け入れます。

購読可能なオブジェクト、Promise、Observableに似たオブジェクト、Arrayオブジェクト、変換可能な反復可能オブジェクトまたは配列に似たオブジェクト

Observable.ofには同様の振る舞いはありません - これは常に値のみを受け入れ、変換は行いません。

74
cartant

配列のような構造体(文字列を含む)を渡すときは、offromの違いに注意することが重要です。

Observable.of([1, 2, 3]).subscribe(x => console.log(x));

配列全体を一度に表示します。

一方、

Observable.from([1, 2, 3]).subscribe(x => console.log(x));

要素を1行ずつ印刷します。

文字列の場合の動作は同じですが、文字レベルです。

125

もう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([])に置き換えた場合、後続のメソッドは呼び出されません。

rxfiddle

9
Josf