BACK
Уроки12. interval и take
Уроки · 12

12. interval и take

interval — бесконечный таймер

interval(period) начинает «тикать» через указанный период. Сначала ждёт period миллисекунд, потом выдаёт 0, потом ещё period мс — выдаёт 1, и так далее. Сам по себе он никогда не завершается.

interval(10)
// 10мс → 0 → 10мс → 1 → 10мс → 2 → ... (бесконечно)

Первый «оператор-помощник» — take

Чтобы безопасно ограничить такой поток, есть оператор take(N). Он пропускает первые N значений и сразу же завершает поток через complete.

interval(10).pipe(take(3))
// 10мс → 0 → 10мс → 1 → 10мс → 2 → complete()

Глоссарий

  • pipe(...) — метод Observable, который позволяет «пропустить» поток через цепочку операторов. Каждый оператор может фильтровать, трансформировать или ограничивать значения.
  • Оператор — функция, которая принимает Observable и возвращает новый Observable с изменённым поведением. take — наш первый оператор.

Внимание

interval без ограничения — частая причина утечек. В реальных приложениях после него почти всегда стоит take, takeUntil или другой способ остановки.

Что нужно сделать

  1. Внутри interval(10).pipe(...) добавьте take(3).
  2. Это ограничит поток первыми тремя значениями: 0, 1, 2.
  3. Marble-проверка ожидает именно такое поведение.

Детерминированная проверка

В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.

Решение spoiler · click to reveal
const { interval, take } = Rx;

const ticks$ = interval(10).pipe(
  take(3)
);
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...