RxJS modeling if else control structures with Observables operators

后端 未结 1 1645
长发绾君心
长发绾君心 2020-12-05 04:27

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

相关标签:
1条回答
  • 2020-12-05 05:16

    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!"))
    
    0 讨论(0)
提交回复
热议问题