组合运算符
使用 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$ changescombineLatest 使用场景
它非常适合派生界面状态:将搜索词和类别过滤条件组合起来生成查询条件。
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 反馈 — 无需本地设置。