Search code examples
javascriptnode.jsrxjs5

Combining Observables - waiting till all observables fire


I have this code:

let $obs = Rx.Observable.merge(
    this.obsEnqueue,
    Rx.Observable.timer(2000)
);

but this isn't doing want I want - want I would like to do is wait until both events fire (an event from this.obsEnqueue and the event from Rx.Observable.timer()).

merge will most likely create a new Observable that will fire when the first event happens from all the observables are passed in. I would like to create a new observable that will fire after all observable passed in have fired.

So more generally:

let $obs = Rx.Observable.X(
    Rx.Observable,    // wait
    Rx.Observable,    // until
    Rx.Observable,    // all of these
    ...
    Rx.Observable     // fire the next event
);

How can I do this? What is X?


Solution

  • You can use zip, if you want to combine all the results when they arrive:

    const { Observable } = Rx;
    
    const result = Observable.zip(
      Observable.of('data1'),
      Observable.of(true).delay(500),
      Observable.timer(1000)
    );
    
    result.forEach(console.log); // after 1000ms: ['data1', true, 0]
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.min.js"></script>