Как получить наблюдаемые события RxJS за нулевое время?

Я собираю все события наблюдаемого data массив:

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>

Можно ли "предвидеть будущее" и получить то же самое data массив без ожидания 2 секунды?

Чтобы уточнить, я пытаюсь найти способ как-то обернуть данную наблюдаемую (obs$ в приведенном выше примере) с пользовательским таймером / планировщиком, чтобы я мог получить события сразу.

1 ответ

Решение

Вы можете создать экземпляр VirtualTimeSchedulerи можете указать это в вызовеinterval,

Если вы тогда позвонитеflushв планировщике после подписки события будут отправлены немедленно:

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>

Другие вопросы по тегам