Уроки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.
Что нужно сделать
- Подписка получает массив
[assets, profile]. Деструктурируйте его прямо в параметре подписки:([assets, profile]) => .... - Внутри сделайте
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
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...