Rxjs. Forkjoin vs Zip и combineLatetst vs withLatestFrom
Вначале хочется упомянуть, что Cédric Soulas недавно запилил новую версию reactive.how.
Forkjoin vs Zip
Эти операторы Rxjs удобны для параллельного вызова http запросов и объединения их результатов. Оба принимают n потоков, ждут значение от всех n потоков и возвращают результат в виде массива.
forkJoinждёт complete всех внутренних потоков, после этого пакует их последние значенияи и один раз выкидывает результат. Если один из внутренних потоков не завершится, тоforkJoinне выкинет значения.zipвыкидывает результат каждый раз как получает по одному значения от каждого из внутренних потоков.

Важной особенностью zip является тот факт, что комбинируются не последние актуальные значения потоков, а просто соответствующие "порядковым номерам" отдельных потоков. Другими словами, если запусть 2 таймера и один из них будет выкидывать значения быстрее, то в результате будут получаться парно одинаковые значения: [0,0], [1,1], [2,2], ...
const { combineLatest, interval } = Rx;
const timer1$ = interval(900);
const timer2$ = interval(1300);
combineLatest(
timer1$,
timer2$,
);combineLatetst vs withLatestFrom
Если же нужны последние значения, то следует применять оператор combineLatetst

const { combineLatest, interval } = Rx;
const timer1$ = interval(900);
const timer2$ = interval(1300);
combineLatest(
timer1$,
timer2$,
);
withLatestFrom очень похож на combineLatetst с тем отличием, что в результатирующий поток не попадет новое значение когда его выкидывает поток withLatestFrom. Простыми словами: когда основной поток выкидывает значение, то он просит withLatestFrom дать последнее значение которое у него было.

const { interval } = Rx;
const { withLatestFrom } = RxOperators;
const timer1$ = interval(380);
const timer2$ = interval(900);
timer2$.pipe(
withLatestFrom(timer1$)
);