在Angular中,拦截器是用于在HTTP请求和响应之间进行预处理和后处理的机制。有时候,我们可能会遇到在发起请求时出现重复的HttpClient调用的问题。以下是解决该问题的代码示例:
import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
@Injectable()
export class DuplicateRequestInterceptor implements HttpInterceptor {
private requests: HttpRequest[] = [];
intercept(req: HttpRequest, next: HttpHandler): Observable> {
// 检查请求是否已经存在
const isDuplicate = this.requests.some(request => req.url === request.url);
if (isDuplicate) {
// 如果是重复请求,直接跳过并返回空Observable对象
return Observable.create();
}
// 将请求添加到请求列表
this.requests.push(req);
return next.handle(req).pipe(
tap(() => {
// 请求完成后从列表中移除请求
const index = this.requests.indexOf(req);
if (index !== -1) {
this.requests.splice(index, 1);
}
})
);
}
}
import { NgModule } from '@angular/core';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { DuplicateRequestInterceptor } from './duplicate-request.interceptor';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, HttpClientModule],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: DuplicateRequestInterceptor,
multi: true
}
],
bootstrap: [AppComponent]
})
export class AppModule {}
通过以上步骤,我们创建了一个名为DuplicateRequestInterceptor
的拦截器,它会在请求发起时检查是否已经存在相同的请求。如果是重复请求,拦截器会直接跳过并返回一个空的Observable对象。在请求完成后,拦截器会从请求列表中移除该请求。
在app.module.ts中,我们将该拦截器提供给HTTP_INTERCEPTORS,这样它就会被应用到所有的HTTP请求中。
这样,我们就可以在发起请求时修复重复的HttpClient调用的问题。