最后更新:2021 年 6 月。
RxJS v7: combineLatestWith
来自reactiveX文档:
每当任何输入 Observable 发出一个值时,它都会使用来自所有输入的最新值计算一个公式,然后发出该公式的输出。
// Observables to combine
const name$ = this._personService.getName(id);
const document$ = this._documentService.getDocument();
name$.pipe(
combineLatestWith((name, document) => {name, document})
)
.subscribe(pair => {
this.name = pair.name;
this.document = pair.document;
this.showForm();
})
(已弃用)RxJS v6 combineLatest()
来自reactiveX文档:
每当任何输入 Observable 发出一个值时,它都会使用来自所有输入的最新值计算一个公式,然后发出该公式的输出。
(更新:2021 年 2 月):
// Deprecated (RxJS v6)
// Observables to combine
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();
})
(替代语法): combineLatest(observables)
// Deprecated (RxJS v6)
// Observables to combine
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 与 combineLatest
(更新:2018 年 10 月)
我之前建议使用zip
方法。但是,对于某些用例,combineLatest
与zip
. 因此,了解差异很重要。
CombineLatest
从 observables 发出最新发出的值。Whilezip
方法按顺序发出发出的项目。
例如,如果 observable #1 发出它的第 3项,而 observable #2 发出它的第 5项。使用zip
方法的结果将是两者的第三个发出的值observables
。
在这种情况下,使用的结果combineLatest
将是5th和3rd。这感觉更自然。
Observable.zip(可观察的)
(原始答案:2017 年 7 月) reactiveX 文档中解释了 Observable.zip 方法:
组合多个 Observable 以创建一个 Observable,其值是根据每个输入 Observable 的值按顺序计算的。
// Observables to combine
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})
是可选的。你可以跳过它,或者做更复杂的操作:
如果最新的参数是一个函数,则该函数用于根据输入值计算创建的值。否则,返回输入值的数组。
所以如果你跳过最后一部分,你会得到一个数组:
// Observables to combine
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();
})