Уроки24. concatMap: очередь задач
Уроки · 24
24. concatMap: очередь задач
concatMap — строгая очередь
concatMap — родной брат mergeMap, но с одним важным отличием: он держит очередь. Следующий внутренний Observable стартует только после того, как предыдущий полностью завершится.
входы: 3 → 1 → 2
mergeMap: все три запускаются параллельно
concatMap: сначала вся задача для 3, потом для 1, потом для 2
Когда выбирать concatMap
- Когда порядок результатов обязан совпадать с порядком входа.
- Последовательные шаги саги, миграция, очередь команд.
- Автосохранение черновика — чтобы старый ответ не перезаписал новое состояние.
Цена очереди
Даже если третья задача быстрее первой, она будет ждать. Это безопасно с точки зрения порядка, но медленнее, чем mergeMap.
Что нужно сделать
- В
pipeдобавьтеconcatMap(value => timer(value * 20).pipe(map(() => 'Done ' + value))). - Тот же источник
3, 1, 2, но теперь порядок сохранится:Done 3 → Done 1 → Done 2.
Детерминированная проверка
В этой задаче проверка идет через виртуальное время TestScheduler. Если решение верное, в консоли появится только Test Passed!. Не добавляйте лишние console.log, иначе проверка провалится.
Решение spoiler · click to reveal
const { of, timer, concatMap, map } = Rx;
const source$ = of(3, 1, 2);
const result$ = source$.pipe(
concatMap(value => {
return timer(value * 20).pipe(
map(() => 'Done ' + value)
);
})
); script.ts
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...