Angular 不断发展的生态系统正在转向更加函数式和响应式编程范式。借助 Signals、资源 API 和 注入函数 等工具,开发人员可以简化应用程序逻辑、减少样板文件并增强可重用性。
这篇博文探讨了 Angular 的现代功能如何使开发人员能够以干净、声明性和响应式的方式处理异步逻辑。
在此示例中,我们将从 REST API 获取帖子。每个帖子都有以下结构:
export interface Post { userId: number; id: number; title: "string;" body: string; }
API 的基本 URL 通过 InjectionToken 提供:
import { InjectionToken } from '@angular/core'; export const API_BASE_URL = new InjectionToken<string>('API_BASE_URL', { providedIn: 'root', factory: () => 'https://jsonplaceholder.typicode.com', });
以下函数使用 Angular 的 HttpClient 按 ID 获取帖子:
import { HttpClient } from '@angular/common/http'; import { inject } from '@angular/core'; import { Observable } from 'rxjs'; import { API_BASE_URL } from '../tokens/base-url.token'; import { Post } from './post.model'; export function getPostById(postId: number): Observable<Post> { const http = inject(HttpClient); const baseUrl = inject(API_BASE_URL); return http.get<Post>(`${baseUrl}/posts/${postId}`); }
要在组件中使用此函数,您可以将其绑定到可观察对象并使用异步管道显示结果:
import { AsyncPipe, JsonPipe } from '@angular/common'; import { Component, signal } from '@angular/core'; import { getPostById } from './shared/posts.inject'; @Component({ selector: 'app-root', standalone: true, imports: [AsyncPipe, JsonPipe], template: ` @if (post$ | async; as post) { <p>{{ post | json }}</p> } @else { <p>Loading...</p> } `, }) export class AppComponent { private readonly postId = signal(1); protected readonly post$ = getPostById(this.postId()); }
资源 API 简化了反应性和状态管理。这是一个使用资源 API 的函数:
import { inject, resource, ResourceRef, Signal } from '@angular/core'; import { API_BASE_URL } from '../tokens/base-url.token'; export function getPostByIdResource(postId: Signal<number>): ResourceRef<Post> { const baseUrl = inject(API_BASE_URL); return resource<Post, { id: number }>({ request: () => ({ id: postId() }), loader: async ({ request, abortSignal }) => { const response = await fetch(`${baseUrl}/posts/${request.id}`, { signal: abortSignal, }); return response.json(); }, }); }
这种方法:
在组件中:
export interface Post { userId: number; id: number; title: "string;" body: string; }
资源 API 自动管理加载、错误和成功等状态。这消除了对自定义标志的需要并确保模板更干净。
Resource API 与 Signals 紧密集成。对 Signal 的更改会自动触发加载器功能,确保您的 UI 始终反映最新数据。
错误通过 .error() 集中并公开,简化了模板中的错误管理。
当依赖项(例如 postId)发生变化时,API 会取消正在进行的请求,从而防止竞争条件和陈旧数据。
Feature | RxJS (Observable) | Resource API (Signal) |
---|---|---|
State Management | Manual | Automatic (loading, error) |
Reactivity | Requires custom setup | Built-in |
Error Handling | Manual | Declarative |
Lifecycle Handling | Requires cleanup | Automatic |
Angular 的注入功能和基于信号的资源 API 代表了简化异步逻辑的飞跃。借助这些工具,开发人员可以:
Resource API 特别适合现代 Angular 项目,提供自动反应性和声明性状态处理。今天就开始探索这些功能,让您的 Angular 开发更上一层楼!
以上是Angular 中的函数式编程:探索注入和资源的详细内容。更多信息请关注PHP中文网其他相关文章!