问题
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.
回答1:
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>
来源:https://stackoverflow.com/questions/43107336/how-to-get-rxjs-observable-events-in-zero-time