Подтвердить что ты не робот

Rxjs: Observable.combineLatest vs Observable.forkJoin

Просто интересно, что такое различия между Observable.combineLatest и Observable.forkJoin? Насколько я вижу, единственное различие: forkJoin ожидает завершения Observables, а combineLatest возвращает последние значения.

4b9b3361

Ответ 1

Не только forkJoin требует, чтобы все входные наблюдаемые были завершены, но также возвращает наблюдаемое, которое создает одно значение, которое представляет собой массив из последних значений, создаваемых входными наблюдаемыми. Другими словами, он ждет, пока завершится последний входной наблюдаемый, а затем произведет одно значение и завершит.

Напротив, combineLatest возвращает Observable, который производит новое значение каждый раз, когда вводят наблюдаемые данные, как только все входные наблюдаемые произведут хотя бы одно значение. Это означает, что он может иметь бесконечные значения и может не завершиться. Это также означает, что входные наблюдаемые данные не должны заполняться, прежде чем создавать значение.

Ответ 2

Также:

зернокомбинация (...) запускает наблюдаемые последовательно, один за другим

combineLatest используется concat, это означает, что значение должно быть получено для каждого наблюдаемого в массиве, прежде чем перейти к следующему.

// partial source of static combineLatest (uses the rxjs/operators combineLatest internally):
// If you're using typescript then the output array will be strongly typed based on type inference
return function (source) { return source.lift.call(from_1.from([source].concat(observables)), 
                           new combineLatest_1.CombineLatestOperator(project)); };

forkJoin (...) одновременно запускает наблюдаемые объекты

Если у вас есть 3 исходные наблюдаемые, и каждая из них запускается по 5 секунд, то для запуска combineLatest потребуется 15 секунд. В то время как forkJoin они выполняются параллельно, так что это займет 5 секунд.

Так что forkJoin работает больше как Promise.all(...) где порядок не исполняется.

Рассмотрение для обработки ошибок:

Если какая-либо из наблюдаемых ошибок выйдет из строя - с combineLatest с combineLatest последующие не будут выполнены, но с помощью forkJoin все они работают. Таким образом, combineLatest может быть полезен для выполнения "последовательности" наблюдаемых и сбора результатов вместе.


Расширенное примечание: если исходные наблюдаемые уже "запущены" (подписаны кем-то другим), и вы используете для них share доступ - тогда вы не увидите такого поведения.

Еще более подробное примечание: CombineLatest всегда будет предоставлять вам последние данные из каждого источника, поэтому, если одна из наблюдаемых исходных текстов выдаст несколько значений, вы получите последнее. Он не просто получает одно значение для каждого источника и переходит к следующему. Если вам нужно убедиться, что вы получаете только "следующий доступный элемент" для каждой наблюдаемой источника, вы можете добавить .pipe(take(1)) к исходной наблюдаемой, когда вы добавляете его во входной массив.

Ответ 3

forkJoin - Когда все наблюдаемые завершены, испускают последнее излученное значение из каждого.

combLatest - когда какой-либо наблюдаемый издает значение, выдает последнее значение из каждого.

Использование довольно похоже, но вы не должны забывать отписаться от комбинатаПоследний в отличие от forkJoin.