Rxjs: Observable.combineLatest vs Observable.forkJoin
Просто интересно, что такое различия между Observable.combineLatest
и Observable.forkJoin
? Насколько я вижу, единственное различие: forkJoin
ожидает завершения Observables, а combineLatest
возвращает последние значения.
Ответы
Ответ 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.