Останнє оновлення: травень 2020 р.
combLatest (спостережувані)
З документації ReactiveX :
Кожного разу, коли будь-який вхідний Observable випромінює значення, він обчислює формулу, використовуючи найновіші значення з усіх вхідних даних, а потім випускає вихідні дані цієї формули.
(Оновлення: травень 2020 р.) Хоча інший приклад залишається дійсним, ось новий синтаксис:
const name$ = this._personService.getName(id);
const document$ = this._documentService.getDocument();
name$.combineLatest(document$, (name, document) => {name, document})
.subscribe(pair => {
this.name = pair.name;
this.document = pair.document;
this.showForm();
})
combLatest (спостережувані) (альтернативний синтаксис):
const name$ = this._personService.getName(id);
const document$ = this._documentService.getDocument();
combineLatest(name$, document$, (name, document) => ({name, document}))
.subscribe(pair => {
this.name = pair.name;
this.document = pair.document;
this.showForm();
})
zip проти compileast
(Оновлення: жовтень 2018 р.)
Раніше я пропонував використовуватиzip
метод. Однак для деяких випадків використанняcombineLatest
має кілька переваг передzip
. Тому важливо розуміти відмінності.
CombineLatest
випромінює останні випущені значення з спостережуваних. У той час як zip
метод випускає випущені елементи в послідовності .
Наприклад, якщо спостережуваний # 1 випускає свій 3-й елемент, а спостережуваний # 2 випускає свій 5-й елемент. Результат із використанням zip
методу буде 3-м випущеним значенням обох observables
.
У цій ситуації результат використання combineLatest
буде 5-м і 3-м . що відчувається більш природно.
Observable.zip (спостережувані)
(Оригінальна відповідь: липень 2017 р.) Метод Observable.zip пояснюється в документації reactiveX :
Поєднує декілька спостережуваних, щоб створити спостережуваний, значення якого обчислюються на основі значень по порядку кожного з його вхідних спостережуваних.
const name$ = this._personService.getName(id);
const document$ = this._documentService.getDocument();
Observable
.zip(name$, document$, (name: string, document: string) => ({name, document}))
.subscribe(pair => {
this.name = pair.name;
this.document = pair.document;
this.showForm();
})
додаткова примітка (застосовується для обох методів)
Останній параметр, де ми надали функцію, (name: string, document: string) => ({name, document})
є необов’язковим. Ви можете пропустити це або зробити більш складні операції:
Якщо останнім параметром є функція, ця функція використовується для обчислення створеного значення з вхідних значень. В іншому випадку повертається масив вхідних значень.
Отже, якщо пропустити останню частину, ви отримаєте масив:
const name$ = this._personService.getName(id);
const document$ = this._documentService.getDocument();
Observable
.zip(name$, document$)
.subscribe(pair => {
this.name = pair['0'];
this.document = pair['1'];
this.showForm();
})