Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RxJS modeling if else control structures with Observables operators

Tags:

rxjs

Is it possible to model if/else control structures via RxJS operators. As far as I understood we could use Observable.filter() to simulate an IF branch, but I am not sure if we simulate an ELSE branch via any of the Observable operator.

like image 621
Artur Ciocanu Avatar asked Sep 15 '15 19:09

Artur Ciocanu


1 Answers

There are a couple operators that you could use to emulate this:

In order from most likely what you are asking for

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();  // Using RxJS >= 6 const [evens, odds] = partition(observableSource, x => x % 2 == 0);  //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 edit renamed to iif in v6

//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]))  // Using RxJS >= 6 iif(() => value > 5, of(5), from([1, 2, 3])) 

case (Only available in 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!")) 
like image 109
paulpdaniels Avatar answered Sep 28 '22 07:09

paulpdaniels