0Pricing
Angular Academy · 课时

组合运算符

使用 combineLatest 和 forkJoin 组合流。

组合运算符 是 CoddyKit 上的免费 Angular Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Angular Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Angular Academy 课程共包含 4 节课。

为何要组合数据流

实际应用需要协调多个异步数据源:多个 HTTP 调用、表单值与过滤条件、点击事件与最新状态。组合运算符会将多个可观察对象合并为一个。

combineLatest

combineLatest 会在任意数据源发出值时,发出每个数据源的最新值组成的数组——但前提是所有数据源都至少发出过一次。

import { combineLatest } from 'rxjs';

combineLatest([name$, age$]).subscribe(
  ([name, age]) => console.log(name, age)
);
// re-emits whenever name$ OR age$ changes

combineLatest 使用场景

它非常适合派生界面状态:将搜索词和类别过滤条件组合起来生成查询条件。

combineLatest([term$, category$]).pipe(
  switchMap(([term, cat]) =>
    this.http.get('/api?q=' + term + '&cat=' + cat))
).subscribe(results => console.log(results));

forkJoin

forkJoin 会等待所有数据源完成,然后发出一个由各数据源最后值组成的数组。它相当于 RxJS 中的 Promise.all。

import { forkJoin } from 'rxjs';

forkJoin({
  user: this.http.get('/api/user'),
  posts: this.http.get('/api/posts')
}).subscribe(({ user, posts }) => {
  console.log(user, posts);
});

forkJoin 的注意事项

如果某个数据源永远不会完成(例如时间间隔数据流),或者在完成前发生错误,forkJoin 就不会发出任何值。请将它用于 HTTP 请求等有限数据源。

合并

merge 会将多个可观察对象扁平化为一个,并按任意数据源到达的顺序发出值,不进行配对。

import { merge } from 'rxjs';

merge(clicks$, keypresses$).subscribe(
  event => console.log('event', event)
);
// emits whenever either source emits

按序配对

zip 按索引配对值:先发出每个数据源的第 1 个值,再发出每个数据源的第 2 个值,依此类推。它会等待所有数据源产生下一个值。

import { zip, of } from 'rxjs';

zip(of(1, 2, 3), of('a', 'b', 'c'))
  .subscribe(([n, l]) => console.log(n, l));
// [1,a], [2,b], [3,c]

预置初始值

startWith 会在开头添加一个初始值,这样在每个数据源都发出值之前,combineLatest 也可以发出值。

import { startWith } from 'rxjs';

combineLatest([
  term$.pipe(startWith('')),
  category$.pipe(startWith('all'))
]).subscribe(([t, c]) => console.log(t, c));

withLatestFrom

withLatestFrom 只在源数据流发出值时才发出结果,并附加其他可观察对象的最新值。源数据流负责驱动,其他数据流处于被动状态。

import { withLatestFrom } from 'rxjs';

saveClick$.pipe(
  withLatestFrom(formValue$)
).subscribe(([_, form]) => this.save(form));

用于顺序数据流的串联

concat 会按顺序订阅每个数据源,只有当前数据源完成后才会转到下一个。需要严格按先后顺序运行数据流时,请使用它。

import { concat, of } from 'rxjs';

concat(of(1, 2), of(3, 4))
  .subscribe(v => console.log(v));
// 1, 2, 3, 4 (second starts after first completes)

combineLatest、forkJoin 与 zip

combineLatest:任意数据源发出值时,取得每个数据源的最新值。
forkJoin:所有数据源完成后,取得每个数据源的最后值。
zip:按索引配对。
请根据您需要持续更新、一次性合并,还是严格配对来选择运算符。

快速检查

测试您对组合运算符的理解。

回顾:组合运算符

组合运算符用于协调多个数据流。

  • combineLatest:任意数据流发出值时,取得每个数据流的最新值。
  • forkJoin:在完成时合并(类似 Promise.all)。
  • merge:交错发出所有值。
  • withLatestFrom:由源数据流驱动,获取其他数据流的快照。

下一节:错误处理运算符。

常见问题解答

「组合运算符」课时是免费的吗?

是的 — 「组合运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Angular Academy 课程的其余内容,请升级到 CoddyKit PRO。 Angular Academy 课程共包含 4 节课。

「组合运算符」这节课中我会学到什么?

使用 combineLatest 和 forkJoin 组合流。 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Angular Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Angular Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「组合运算符」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Angular Academy 课中编写并运行代码吗?

能。每节 Angular Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 转换运算符
  2. 筛选运算符
  3. 组合运算符
  4. 错误处理运算符
← 返回 Angular Academy