在 Angular 2+ 中,当发起 HTTP 请求时,有时需要取消正在进行的请求。这在用户导航离开页面、组件销毁或手动取消操作时特别有用。
Angular 的 HttpClient 返回的是 Observable,可以通过取消订阅来中止 HTTP 请求。
import { Component, OnDestroy } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Subscription } from 'rxjs';
@Component({
selector: 'app-example',
template: `
<button (click)="makeRequest()">发起请求</button>
<button (click)="cancelRequest()">取消请求</button>
`
})
export class ExampleComponent implements OnDestroy {
private subscription: Subscription;
constructor(private http: HttpClient) {}
makeRequest() {
this.subscription = this.http.get('https://api.example.com/data')
.subscribe(
response => console.log(response),
error => console.error(error)
);
}
cancelRequest() {
if (this.subscription) {
this.subscription.unsubscribe();
console.log('请求已取消');
}
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
}
import { Component, OnDestroy } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@Component({
selector: 'app-example',
template: `
<button (click)="makeRequest()">发起请求</button>
<button (click)="cancelRequest()">取消请求</button>
`
})
export class ExampleComponent implements OnDestroy {
private destroy$ = new Subject<void>();
constructor(private http: HttpClient) {}
makeRequest() {
this.http.get('https://api.example.com/data')
.pipe(takeUntil(this.destroy$))
.subscribe(
response => console.log(response),
error => console.error(error)
);
}
cancelRequest() {
this.destroy$.next();
console.log('请求已取消');
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
import { Component } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
@Component({
selector: 'app-example',
template: `
<button (click)="makeRequest()">发起请求</button>
<button (click)="cancelRequest()">取消请求</button>
`
})
export class ExampleComponent {
private abortController: AbortController;
constructor(private http: HttpClient) {}
makeRequest() {
this.abortController = new AbortController();
const options = {
headers: new HttpHeaders(),
signal: this.abortController.signal
};
this.http.get('https://api.example.com/data', options)
.subscribe(
response => console.log(response),
error => {
if (error.name === 'AbortError') {
console.log('请求被取消');
} else {
console.error(error);
}
}
);
}
cancelRequest() {
if (this.abortController) {
this.abortController.abort();
console.log('请求已取消');
}
}
}
推荐使用 takeUntil
方法,因为它:
没有搜到相关的文章