面试题答案
一键面试实现思路
- 使用
RxJS
的forkJoin
来并发执行多个HTTP
请求。forkJoin
会等待所有的Observable
都完成,然后返回一个包含所有结果的数组。 - 为每个
HTTP
请求的Observable
添加catchError
操作符,以便在某个请求失败时捕获错误。 - 一旦捕获到错误,使用
RxJS
的Subject
或BehaviorSubject
来通知其他请求取消。可以将取消逻辑封装在一个Observable
中,然后使用takeUntil
操作符来取消正在进行的请求。 - 给用户显示友好的错误提示。
核心代码
假设我们有5个 HTTP
请求获取不同模块的数据,以下是核心代码示例:
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { forkJoin, Observable, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
private destroy$ = new Subject<void>();
constructor(private http: HttpClient) {
const request1$ = this.http.get('/api/module1').pipe(
takeUntil(this.destroy$),
catchError(error => {
this.showError('请求模块1失败', error);
this.destroy$.next();
throw error;
})
);
const request2$ = this.http.get('/api/module2').pipe(
takeUntil(this.destroy$),
catchError(error => {
this.showError('请求模块2失败', error);
this.destroy$.next();
throw error;
})
);
const request3$ = this.http.get('/api/module3').pipe(
takeUntil(this.destroy$),
catchError(error => {
this.showError('请求模块3失败', error);
this.destroy$.next();
throw error;
})
);
const request4$ = this.http.get('/api/module4').pipe(
takeUntil(this.destroy$),
catchError(error => {
this.showError('请求模块4失败', error);
this.destroy$.next();
throw error;
})
);
const request5$ = this.http.get('/api/module5').pipe(
takeUntil(this.destroy$),
catchError(error => {
this.showError('请求模块5失败', error);
this.destroy$.next();
throw error;
})
);
forkJoin([request1$, request2$, request3$, request4$, request5$]).subscribe(results => {
// 所有请求成功,处理结果
console.log('所有请求成功', results);
});
}
showError(message: string, error: any) {
console.error(message, error);
// 这里可以使用Angular的弹窗服务等给用户友好提示
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
涉及到的 HttpClient
和 RxJS
特性
HttpClient
:用于发起HTTP
请求,是Angular中处理HTTP
操作的核心模块。它返回一个Observable
,使得我们可以方便地结合RxJS
操作符进行处理。RxJS
的forkJoin
:用于并发执行多个Observable
,并等待所有Observable
完成后返回结果。当其中任何一个Observable
出错时,forkJoin
会立即终止,并将错误传递给订阅者。catchError
操作符:用于捕获Observable
中的错误,并可以选择处理错误或重新抛出错误。在这里,我们捕获请求失败的错误,显示友好提示并取消其他请求。Subject
和takeUntil
操作符:Subject
用于创建一个可观察对象,我们可以手动触发它的next
方法来发送值。takeUntil
操作符用于监听另一个Observable
,当该Observable
发出值时,会取消当前Observable
的订阅,从而实现取消正在进行的请求。