web-dev-qa-db-ja.com

RxJS:Observable.create()とObservable.from()

これら2つの違いは何ですか?

return Observable.create(function(observer) {
    if (array)
        observer.next([]);
    else
        observer.next(null);
    observer.complete();
});

そして

return Observable.from( array ? [] : null );

同じかもしれないと思ったが同じようには動かなかった。

11
Ondra Žižka

create(...)は、Observableを作成するための汎用のObservableファクトリメソッドであり、値をSubscriberに渡す方法を明示的に指示します

たとえば、タイマーベースObservableを作成する場合(_Observable.timer_として既に存在しない場合)、次のようにできます。

_   Observable.create(observer => {
     const timeoutId = setTimeout(() => {
       observer.next(0);
       observer.complete();
     }, 500);

     return () => clearTimeout(timeoutId);
   });
_

from(...)は、渡されたデータ型をObservable(強制的に適合させる)に変換しようとする点で、conformance演算子と呼んでいます。これは、さまざまなタイプを受け入れ、それらをObservablesに変換することを意味します。これらのタイプは次のとおりです。

  • 配列
  • 約束
  • 発電機
  • 観察可能なもの

fromArrayfromPromiseなどの特定のコンバーターがあり、これらのタイプを具体的に変換しますが、fromこれらのメソッドのスイスアーミーナイフの詳細

単一の値が必要な場合は、_Observable.of_を使用する必要があります(ドキュメントは古くなっているようです。RxJS5では_just/return_はofに名前が変更されましたが、私はそれらを考えていませんもうエイリアスされます)。

つまり.

_// Don't quote me on the import part
import 'rxjs/add/observable/of';

Observable.of(1, 2, 3, 4).subscribe();
_
16
paulpdaniels

配列を返す場合、「create/next」は配列全体を一度に発行しますが、「from」は各アイテムをその長さの数だけ発行するので、サブスクライバーには、

Observable.create(observer => observer.next(myArray))はonNextイベントを1回起動してmyArrayを返しますが、Observable.from(myArray)は多くのonNextイベントを発行して毎回1つのアイテムを返します。

0
bob

1つの違いは、Observable.from()は、nullを受け入れるものとして具体的に禁止します。したがって、1つ目は、nullを返すオブザーバブルを作成するための一種の回避策です。 (ただし、主な違いについては、承認済みの回答を参照してください。)

より良い(短い)方法は just を使用することです:

return Observable.just( array ? [] : null );

しかし、それを入手する場所やインポート方法を見つけることができませんでした。

import 'rxjs/add/operator/just';

これは私のrxjsのディストリビューションにはありません。
編集:justofに名前が変更されました。承認された回答を参照してください。

0
Ondra Žižka

Observable.from():
値のリストがあり(Rxとは関係ありません)、Observableが作成されますfromこのリスト。オブザーバーがこのObservableをサブスクライブすると、値のリストがNext()イベントとして1つずつ渡され、その後Completed()が渡されるため、このプロセスを制御できません。

Observable.create():
イベントを1つずつ明示的に発行して、イベントのシーケンスを作成します。したがって、いつでもOnCompletedイベントとOnErrorイベントを発行できます。

0
Tony