「of」演算子と「from」演算子


153

Observable.ofObservable.from引数の形式の唯一の違いはありますか?同様にFunction.prototype.callしてFunction.prototype.apply

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

回答:


115

結構です。配列をObservable.fromに渡すとき、との唯一の違いObservable.ofは、引数が渡される方法です。

ただし、次Observable.from引数を受け入れます

サブスクライブ可能なオブジェクト、Promise、Observableのような配列、Array、反復可能なオブジェクト、または変換される配列のようなオブジェクト

同様の動作はありませんObservable.of-常に値のみを受け入れ、変換を実行しません。


193

違いに注意することが重要であるoffrom(文字列を含む)のアレイ状の構造を渡します。

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

配列全体を一度に出力します。

一方、

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

要素を1行1列に出力します。

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


Observable.of(1、2、3).subscribe(x => console.log(x));の場合
xiaoke 2017

1
@xiaokeでは、確かに3つの個別の排出量です(1、2、3)。
Tsvetan Ovedenski 2017

16

別の興味深い事実は、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


6

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'


0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.