面试题答案
一键面试实现思路
- 捕获HTTP请求错误:使用
catchError
操作符捕获HTTP请求过程中发生的错误。 - 设置重试逻辑:根据设置的重试次数,使用
retryWhen
操作符来定义重试机制。 - 控制重试间隔时间:在
retryWhen
中使用delay
操作符来设置每次重试之间的间隔时间。 - 记录日志:在每次重试前使用
tap
操作符记录日志。
代码示例
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { catchError, delay, map, retryWhen, tap } from 'rxjs/operators';
import { Observable, throwError } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class HttpService {
constructor(private http: HttpClient) {}
public get<T>(url: string, options: {
retryCount: number;
retryDelay: number;
}): Observable<T> {
return this.http.get<T>(url).pipe(
catchError(error => {
console.error('Initial request failed:', error);
return throwError(error);
}),
retryWhen(errors => errors.pipe(
tap((error: any, index: number) => {
console.error(`Retry ${index + 1} due to error:`, error);
}),
delay(options.retryDelay),
map((error: any, index: number) => {
if (index >= options.retryCount - 1) {
throw error;
}
return error;
})
))
);
}
}
在组件中使用:
import { Component } from '@angular/core';
import { HttpService } from './http.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private httpService: HttpService) {}
ngOnInit() {
this.httpService.get<any>('your-url', {
retryCount: 3,
retryDelay: 2000
}).subscribe(data => {
console.log('Success:', data);
}, error => {
console.error('Final error after retries:', error);
});
}
}