BACK
Уроки28. merge и concat: слияние или очередь
Уроки · 28

28. merge и concat: слияние или очередь

Объединение нескольких потоков

Иногда у нас уже есть два или более готовых Observable, и нужно объединить их в один. merge и concat — две стратегии для этого.

merge — слияние «по мере прихода»

merge(a$, b$) подписывается на оба источника одновременно. Значения пропускаются как только появятся, независимо от того, кто это прислал.

concat — строгая последовательность

concat(a$, b$) подписывается только на первый источник. Когда он полностью завершится, подпишется на второй. Значения второго не появятся, пока не закончится первый.

concat(cache$, server$)
// сначала всё из cache$ → complete → потом всё из server$

Типичный сценарий concat

«Сначала показать кэш, потом обновить с сервера». Пользователь видит результат мгновенно, и через мгновение он обновляется свежими данными.

Ловушка

Если первый поток никогда не завершится (например, interval без take), второй не запустится никогда.

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

  1. Замените const result$ = cache$; на const result$ = concat(cache$, server$);.
  2. Сначала выйдет Cache Data, потом — после задержки — Server Data.

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

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

Решение spoiler · click to reveal
const { of, timer, concat, map } = Rx;

const cache$ = of('Cache Data');
const server$ = timer(30).pipe(map(() => 'Server Data'));

const result$ = concat(cache$, server$);
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...