4

I'm collecting all the events of an Observable to a data array:

const obs$ = Rx.Observable
  .interval(500)
  .take(4);

let data = [];
const start = performance.now();

obs$.subscribe(
  value => {
    data.push({
      time: performance.now() - start,
      data: value
    });
  },
  () => {},
  () => {
    console.log(JSON.stringify(data, null, 2));
  }
);
<script src="https://unpkg.com/rxjs@5.2.0/bundles/Rx.js"></script>

Is it possible to "foresee the future" and get the same data array without waiting 2 seconds?

To clarify, I'm trying to find a way to wrap somehow a given Observable (obs$ in the example above) with a custom timer/scheduler so I could get the events immediately.

Misha Moroshko
  • 166,356
  • 226
  • 505
  • 746
  • I'm not really sure what you are asking. [`interval`](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-interval) emits a sequence of integers with the specified interval between them. If you want the sequence of integers to be emitted immediately, you can use [`range`](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-range) instead. – cartant Mar 30 '17 at 02:39
  • @cartant I'm trying to find a way to wrap somehow a given Observable (`obs$` in the example above) with a custom timer/scheduler so I could get the events immediately. – Misha Moroshko Mar 30 '17 at 02:47

1 Answers1

5

You can create an instance of the VirtualTimeScheduler and can specify it in the call to interval.

If you then call flush on the scheduler after subscribing, the events will be emitted immediately:

const scheduler = new Rx.VirtualTimeScheduler();

const obs$ = Rx.Observable
  .interval(500, scheduler)
  .take(4);

let data = [];
const start = scheduler.now();

obs$.subscribe(
  value => {
    data.push({
      time: scheduler.now() - start,
      data: value
    });
  },
  () => {},
  () => {
    console.log(JSON.stringify(data, null, 2));
  }
);

scheduler.flush();
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5.2.0/bundles/Rx.js"></script>
cartant
  • 57,105
  • 17
  • 163
  • 197
  • Thanks! That's what I was looking for. The only question is: Is it possible to take an existing Observable and inject a scheduler to it? – Misha Moroshko Mar 30 '17 at 04:39
  • Not that I'm aware of. There are [`observeOn`](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-observeOn) and [`subscribeOn`](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-subscribeOn) operators, but they won't change the source observable's scheduler. – cartant Mar 30 '17 at 05:22