Доброго времени суток, дорогие читатели!  В данной статье я буду рассказывать про холодную и горячую последовательность на примере такой задачи:  Пользователь заходит на сайт и начинается внутренняя прослушка (какой либо запрос на сервер с получением данных, в нашем же случае будет обычный sleepAsync — функция с таймаутом и остается только его подхватить и обработать). Режимов прослушки два — оптимизированный (будем называть горячим) и константный (будем называть холодным). При условии активности пользователя на вкладке, включаем оптимизированный метод, если же пользователь покинул вкладку, включаем константный. Также нужно показывать количество времени, которое занимала прослушка. Зарисовка - как будет выглядеть логика итоговой программы: Все нужные переменные: Самое простое - возьмем откуда нибудь функцию sleepAsync для имитирования запроса на БД. В моем случае я нашел вот такую функцию: Как видим, она даже с abortSignal'ом, поэтому будем использовать еще и его :) К ней добавим функцию fetchAsync - та самая имитация прослушки. Функция просто возвращает случайное число и записывает его в immutable список. Перейдем к функции, получающей это значение и обрабатывающей его: Теперь виновник торжества - функция для построения двух потоков: Так, пробежимся по операторам, которые я использовал и почему — switchMapдумаю самый понятный из них, т.к. этот оператор позволяет как раз‑таки менять потоки друг на друга, что нам и требуется в контексте изменений активности вкладки. Теперь наверное главный вопрос — почему везде concatMap , а не обычный map? В данном коде встречается оператор concatMap вместо map, и разница между ними действительно важна. Оператор map применяет указанную функцию к каждому элементу потока и возвращает новый элемент, который заменяет исходный элемент в потоке. В данном контексте это было бы недостаточно, потому что нужно выполнить некоторые асинхронные операции и сохранить последовательность выполнения. Оператор map не подходит для работы с асинхронными операциями, так как он просто трансформирует каждый элемент независимо от других элементов в потоке. Оператор concatMap, с другой стороны, используется для выполнения асинхронных операций, сохраняя последовательность их выполнения. Когда используется concatMap, каждый элемент исходного потока будет обработан последовательно, то есть следующая операция не начнется до завершения предыдущей. Если бы мы использовалиmap вместо concatMap, то асинхронные операции не были бы выполнены последовательно (синхронно, параллельно, непонятно — всегда по разному, процессорное время оно такое — непостоянное, где то системный файл заберет время, где то ядро выделит пространство для другого процесса и всякое в таком духе). А с помощью concatMap, каждая операция будет выполнена в правильной последовательности, что особенно важно в данном контексте, так как предполагается выполнение некоторых действий по мере поступления элементов из intervalArray. Таким образом, мы используемconcatMap, чтобы гарантировать последовательное выполнение асинхронных операций для каждого элемента потока и поддержание правильного порядка действий. Итого, что мы имеем — два метода работы холодной и горячей последовательности, которые опрашивают сервер в определенный момент времени в зависимости от действий пользователя, в нашем случае — активности / неактивности вкладки. Код как обычно выложил на свой гитхаб. Надеюсь статья была для Вас полезна! Если есть пожелания / улучшения моего кода — то добро пожаловать в комментарии!) До встречи в следующей статье!  Frontend developer (VueJS, Typescript)