使用 rxMethod 处理异步任务
使用 rxMethod 处理异步流程
使用 rxMethod 处理异步任务 是 CoddyKit 上的免费 Angular Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Angular Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Angular Academy 课程共包含 4 节课。
SignalStore 中的异步操作
许多操作都是异步的,例如加载数据、防抖搜索和轮询。SignalStore 提供 rxMethod 来管理这些具有响应式且可取消的异步流程。
rxMethod 基础
rxMethod 会创建一个由 RxJS 管道支持的方法。您可以用值(或信号/observable)调用它,值就会被推入该流中。
import { rxMethod } from '@ngrx/signals/rxjs-interop';
import { pipe, switchMap, tap } from 'rxjs';
withMethods((store, api = inject(Api)) => ({
load: rxMethod<string>(pipe(
switchMap(id => api.getById(id)),
tap(item => patchState(store, { current: item }))
))
}))调用 rxMethod
像调用普通方法一样使用普通值调用它。该值会进入您定义的管道。
store.load('42');传入信号
您可以将 signal 传递给 rxMethod。每当该信号发生变化时,它都会自动重新运行管道,非常适合响应式加载。
selectedId = signal('1');
ngOnInit() {
this.store.load(this.selectedId); // reloads when selectedId changes
}switchMap 取消过时的工作
使用 switchMap 意味着新的发出值会取消之前正在进行的请求。这样可以避免旧的慢响应覆盖较新的响应所导致的竞态条件。
跟踪加载状态
在开始时设置 loading 标志,并在完成时将其清除,这样界面就可以显示加载指示器。
load: rxMethod<string>(pipe(
tap(() => patchState(store, { loading: true })),
switchMap(id => api.getById(id).pipe(
tap(item => patchState(store, { current: item, loading: false }))
))
))错误处理
必须在管道内部处理错误,否则流会完成,方法也会停止工作。请在内部 observable 中使用 catchError。
switchMap(id => api.getById(id).pipe(
tap(item => patchState(store, { current: item, error: null })),
catchError(err => {
patchState(store, { error: err.message, loading: false });
return EMPTY;
})
))防抖搜索
组合基于时间的操作符,实现输入即搜索。该管道的防抖和切换行为与普通 RxJS 中一样。
search: rxMethod<string>(pipe(
debounceTime(300),
distinctUntilChanged(),
switchMap(q => api.search(q)),
tap(results => patchState(store, { results }))
))选择扁平化操作符
使用 switchMap 取消过时的工作,使用 concatMap 排队,使用 mergeMap 并行处理,使用 exhaustMap 在繁忙时忽略新调用。请根据所需的并发行为进行选择。
自动清理
管道的订阅与 store 的生命周期绑定。当 store 被销毁时(组件作用域的 store),流也会被拆除,因此不会产生内存泄漏,也无需手动取消订阅。
创建时初始化
将 rxMethod 与 withHooks feature 结合,在 store 创建时触发初始加载。
withHooks({
onInit(store) { store.load('initial'); }
})快速检查
检查您对 rxMethod 的掌握程度。
回顾
您使用 rxMethod 处理异步流程:可以传入值或信号,选择扁平化操作符(使用 switchMap 取消过时的工作),跟踪加载状态,使用 catchError 处理错误,并依靠自动订阅清理。
常见问题解答
「使用 rxMethod 处理异步任务」课时是免费的吗?
是的 — 「使用 rxMethod 处理异步任务」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Angular Academy 课程的其余内容,请升级到 CoddyKit PRO。 Angular Academy 课程共包含 4 节课。
「使用 rxMethod 处理异步任务」这节课中我会学到什么?
使用 rxMethod 处理异步流程 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Angular Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Angular Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 rxMethod 处理异步任务」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Angular Academy 课中编写并运行代码吗?
能。每节 Angular Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 创建 SignalStore
- 计算状态与方法
- 使用 rxMethod 处理异步任务
- 实体与自定义功能