28. merge и concat: слияние или очередь
Объединение нескольких потоков
Иногда у нас уже есть два или более готовых Observable, и нужно объединить их в один. merge и concat — две стратегии для этого.
merge — слияние «по мере прихода»
merge(a$, b$) подписывается на оба источника одновременно. Значения пропускаются как только появятся, независимо от того, кто это прислал.
concat — строгая последовательность
concat(a$, b$) подписывается только на первый источник. Когда он полностью завершится, подпишется на второй. Значения второго не появятся, пока не закончится первый.
concat(cache$, server$)
// сначала всё из cache$ → complete → потом всё из server$
Типичный сценарий concat
«Сначала показать кэш, потом обновить с сервера». Пользователь видит результат мгновенно, и через мгновение он обновляется свежими данными.
Ловушка
Если первый поток никогда не завершится (например, interval без take), второй не запустится никогда.
Что нужно сделать
- Замените
const result$ = cache$;наconst result$ = concat(cache$, server$);. - Сначала выйдет
Cache Data, потом — после задержки —Server Data.
Детерминированная проверка
В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.
const { of, timer, concat, map } = Rx;
const cache$ = of('Cache Data');
const server$ = timer(30).pipe(map(() => 'Server Data'));
const result$ = concat(cache$, server$);