BACK
Уроки24. concatMap: очередь задач
Уроки · 24

24. concatMap: очередь задач

concatMap — строгая очередь

concatMap — родной брат mergeMap, но с одним важным отличием: он держит очередь. Следующий внутренний Observable стартует только после того, как предыдущий полностью завершится.

входы: 3 → 1 → 2
mergeMap:  все три запускаются параллельно
concatMap: сначала вся задача для 3, потом для 1, потом для 2

Когда выбирать concatMap

  • Когда порядок результатов обязан совпадать с порядком входа.
  • Последовательные шаги саги, миграция, очередь команд.
  • Автосохранение черновика — чтобы старый ответ не перезаписал новое состояние.

Цена очереди

Даже если третья задача быстрее первой, она будет ждать. Это безопасно с точки зрения порядка, но медленнее, чем mergeMap.

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

  1. В pipe добавьте concatMap(value => timer(value * 20).pipe(map(() => 'Done ' + value))).
  2. Тот же источник 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 // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...