BACK
Уроки31. forkJoin: дождаться завершения всех задач
Уроки · 31

31. forkJoin: дождаться завершения всех задач

forkJoin — RxJS-аналог Promise.all

Если вы знакомы с Promise.all — это самый похожий концепт. forkJoin([a$, b$, c$]) подписывается на все источники, ждёт, пока каждый завершится, и тогда отдаёт массив их последних значений одним сигналом.

forkJoin([assets$, profile$])
// после complete обоих → next(['Assets OK', 'Profile OK']) → complete()

Когда использовать

Когда есть несколько независимых HTTP-запросов, и UI нужно показать только после получения всех. Например: загрузка профиля + загрузка прав + загрузка настроек.

Главная опасность

Если хотя бы один источник не завершается (например, interval), forkJoin будет ждать вечно. Подходит только для конечных Observable.

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

  1. Подписка получает массив [assets, profile]. Деструктурируйте его прямо в параметре подписки: ([assets, profile]) => ....
  2. Внутри сделайте values.push('Ready: ' + assets + ', ' + profile).

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

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

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

const assets$ = timer(10).pipe(map(() => 'Assets OK'));
const profile$ = timer(20).pipe(map(() => 'Profile OK'));

const ready$ = forkJoin([assets$, profile$]);

ready$.subscribe(([assets, profile]) => {
  values.push('Ready: ' + assets + ', ' + profile);
});
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...