web-dev-qa-db-ja.com

Observables演算子を使用して構造を制御する場合のRxJSモデリング

RxJS演算子を介してif/else制御構造をモデル化することは可能ですか?私が理解した限りでは、Observable.filter()を使用してIFブランチをシミュレートできましたが、Observable演算子を使用してELSEブランチをシミュレートするかどうかはわかりません。

27
Artur Ciocanu

これをエミュレートするために使用できる演算子がいくつかあります。

最も可能性の高いものから順番に

partition

//Returns an array containing two Observables
//One whose elements pass the filter, and another whose elements don't

var items = observableSource.partition((x) => x % 2 == 0);

var evens = items[0];
var odds = items[1];

//Only even numbers
evens.subscribe();

//Only odd numbers
odds.subscribe();

groupBy

//Uses a key selector and equality comparer to generate an Observable of GroupedObservables
observableSource.groupBy((value) => value % 2, (value) => value)
  .subscribe(groupedObservable => {
    groupedObservable.subscribe(groupedObservable.key ? oddObserver : evenObserver);
  });

if

//Propagates one of the sources based on a particular condition
//!!Only one Observable will be subscribed to!!
Rx.Observable.if(() => value > 5, Rx.Observable.just(5), Rx.Observable.from([1,2, 3]))

case (RxJS 4でのみ利用可能)

//Similar to `if` but it takes an object and only propagates based on key matching
//It takes an optional argument if none of the items match
//!!Only one Observable will be subscribed to!!
Rx.Observable.case(() => "blah",
{
  blah : //..Observable,
  foo : //..Another Observable,
  bar : //..Yet another
}, Rx.Observable.throw("Should have matched!"))
45
paulpdaniels