转换运算符
使用 map、switchMap、mergeMap 和 concatMap。
转换运算符 是 CoddyKit 上的免费 Angular Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Angular Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Angular Academy 课程共包含 4 节课。
什么是操作符
操作符是您在 .pipe() 中组合使用、用于转换流的函数。转换操作符会改变每个产生的值,或将内部 observables 展平为输出。
map
map 会转换每个产生的值,类似于 Array.map,但它会随时间处理值。
import { of, map } from 'rxjs';
of(1, 2, 3).pipe(
map(n => n * 10)
).subscribe(v => console.log(v)); // 10, 20, 30为什么需要高阶映射
当每个值都会触发另一个 observable(例如 HTTP 调用)时,您得到的是由 observables 组成的 observable。展平操作符(switchMap、mergeMap、concatMap)会订阅内部 observable,并产生其值。
switchMap
当新值到达时,switchMap 会取消之前的内部 observable。它非常适合即时搜索,因为旧请求会被丢弃。
import { switchMap } from 'rxjs';
searchTerm$.pipe(
switchMap(term => this.http.get('/api/search?q=' + term))
).subscribe(results => console.log(results));mergeMap
mergeMap(别名 flatMap)会并发运行内部 observables,并合并它们产生的所有值。不会取消任何操作。
import { mergeMap } from 'rxjs';
ids$.pipe(
mergeMap(id => this.http.get('/api/item/' + id))
).subscribe(item => console.log(item));
// all requests run in parallelconcatMap
concatMap 会将内部 observables 排队,并按顺序逐个运行,等待每个完成后再处理下一个。需要保证顺序时请使用它。
import { concatMap } from 'rxjs';
saveQueue$.pipe(
concatMap(payload => this.http.post('/api/save', payload))
).subscribe();
// requests run sequentially, in orderexhaustMap
exhaustMap 会在内部 observable 仍在运行时忽略新值。它非常适合防止按钮重复提交。
import { exhaustMap } from 'rxjs';
submitClicks$.pipe(
exhaustMap(() => this.http.post('/api/login', creds))
).subscribe();
// extra clicks ignored until request finishes选择合适的展平操作符
switchMap:取消之前的操作(搜索)。
mergeMap:全部并行执行(相互独立的写入)。
concatMap:按顺序逐个执行(顺序保存)。
exhaustMap:忙碌时忽略新值(登录按钮)。
switchMap 与取消
由于 switchMap 会取消正在运行的内部 observables,它也会取消底层 HTTP 请求的订阅。Angular 会将其转换为已中止的请求,从而节省带宽。
将 map 与展平操作符结合
展平之后,您经常会使用 map 来提取数据。
searchTerm$.pipe(
switchMap(term => this.http.get('/api/search?q=' + term)),
map(res => res.items)
).subscribe(items => console.log(items));避免嵌套订阅
不要在 subscribe 中再次订阅。请改用展平操作符——它能让 pipeline 保持声明式,并正确处理清理工作。
// BAD:
// outer$.subscribe(v => inner$(v).subscribe(...));
// GOOD:
// outer$.pipe(switchMap(v => inner$(v))).subscribe(...);快速检查
测试您对转换运算符的理解。
回顾:转换运算符
map 用于转换值;扁平化运算符用于处理内部可观察对象。
switchMap:取消之前的操作。mergeMap:并行执行。concatMap:按顺序执行,并保持顺序。exhaustMap:忙碌时忽略新的值。
下一节:过滤运算符。
常见问题解答
「转换运算符」课时是免费的吗?
是的 — 「转换运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Angular Academy 课程的其余内容,请升级到 CoddyKit PRO。 Angular Academy 课程共包含 4 节课。
「转换运算符」这节课中我会学到什么?
使用 map、switchMap、mergeMap 和 concatMap。 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Angular Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Angular Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「转换运算符」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Angular Academy 课中编写并运行代码吗?
能。每节 Angular Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。