Sobes.tech
Назад к вопросам
Middle+
4

Чем отличаются RxJS операторы zip, combineLatest и forkJoin? Сколько эмитов у каждого?

Компании, где спрашивали
Банк Ренессанс

Ответ от нейросети

sobes.tech AI

В RxJS операторы zip, combineLatest и forkJoin используются для комбинирования нескольких Observable, но работают по-разному и имеют разное поведение по количеству эмитов:

  • zip: объединяет значения из нескольких Observable по индексам. Каждый эмит происходит, когда все исходные Observable выдали новое значение. Количество эмитов равно количеству минимальных значений среди всех Observable. Если один из Observable завершится, zip завершится.

    import { zip, of } from 'rxjs';
    
    const a = of(1, 2, 3);
    const b = of('a', 'b', 'c');
    
    zip(a, b).subscribe(console.log); // Выведет [1, 'a'], [2, 'b'], [3, 'c']
    
  • combineLatest: эмитит каждый раз, когда любой из Observable выдаёт новое значение, но только после того, как все Observable хотя бы один раз эмитнули. Количество эмитов зависит от активности Observable и может быть больше, чем у zip.

  • forkJoin: ждёт завершения всех Observable и эмитит единожды массив последних значений каждого Observable. Если один из Observable не завершится, forkJoin не эмитит.

Итого:

  • zip: количество эмитов = минимальное количество значений среди Observable
  • combineLatest: количество эмитов зависит от активности всех Observable после первого эмита каждого
  • forkJoin: ровно один эмит после завершения всех Observable

Это важно учитывать при выборе оператора для синхронизации потоков данных.