Angular 2 - 在 POST 之前取消 HttpInterceptor 中挂起的 GET 请求
Angular 2 - Cancel pending GET request in HttpInterceptor before POST
我的 API 的 GET 请求会定期轮询。如果我在 GET 请求挂起时发出 POST 请求,并且 POST returns 使用新数据,则 GET 请求中的数据将过时。
使用 HttpInterceptor
我可以在发送 POST 之前取消所有待处理的 GET 请求吗?
我被告知我不能将 req
传递给 next.handle()
但我应该传递什么 req
呢?
如果我们谈论 Angular 2,您可能会用下一种方式调用您的 API:
this.http.get('url').map(res => { ... }).catch(error => { ... });
它 return 是可观察的,一旦你订阅它,它就 return 是一个订阅。一旦您退订 - 它将取消您的请求。查看完整示例:
service.ts
getData(): Observable<any> {
return this.http.get('url').map(res => { ... }).catch(error => { ... });
}
component.ts
requestSubscription: Subscription;
ngOnInit() {
this.requestSubscription = this.service.getData().subscribe(data => { ... });
}
someFuncWhereYouHandlePOSTSuccess() {
if (this.requestSubscription) {
this.requestSubscription.unsubscribe();
}
}
希望这个概念足够清楚。如果没有 - 我准备好回答您的问题。
编辑
由于 OP 引导我走上了正确的道路,我认为我的解决方案属于他的建议旁边的正确答案。
解决方案service.ts
private breakPolling: boolean = false;
constructor(private httpClient: HttpClient) {
}
getData() {
return this.httpClient
.get(this.url)
.map((response) => {
if (this.breakPolling) {
this.breakPolling = false;
return Observable.empty();
} else {
return response;
}
});
}
breakPolling() {
this.breakPolling = true;
return Observable.empty();
}
我派发一个将调用 breakPolling()
方法的操作并设置一个简单的布尔值。我只是 return 一个空的 Observable,而不是 return 将响应数据作为一个 Observable。
它不会取消请求,但会阻止传递其数据。它很丑,但它会修补。
我的 API 的 GET 请求会定期轮询。如果我在 GET 请求挂起时发出 POST 请求,并且 POST returns 使用新数据,则 GET 请求中的数据将过时。
使用 HttpInterceptor
我可以在发送 POST 之前取消所有待处理的 GET 请求吗?
我被告知我不能将 req
传递给 next.handle()
但我应该传递什么 req
呢?
如果我们谈论 Angular 2,您可能会用下一种方式调用您的 API:
this.http.get('url').map(res => { ... }).catch(error => { ... });
它 return 是可观察的,一旦你订阅它,它就 return 是一个订阅。一旦您退订 - 它将取消您的请求。查看完整示例:
service.ts
getData(): Observable<any> {
return this.http.get('url').map(res => { ... }).catch(error => { ... });
}
component.ts
requestSubscription: Subscription;
ngOnInit() {
this.requestSubscription = this.service.getData().subscribe(data => { ... });
}
someFuncWhereYouHandlePOSTSuccess() {
if (this.requestSubscription) {
this.requestSubscription.unsubscribe();
}
}
希望这个概念足够清楚。如果没有 - 我准备好回答您的问题。
编辑
由于 OP 引导我走上了正确的道路,我认为我的解决方案属于他的建议旁边的正确答案。
解决方案service.ts
private breakPolling: boolean = false;
constructor(private httpClient: HttpClient) {
}
getData() {
return this.httpClient
.get(this.url)
.map((response) => {
if (this.breakPolling) {
this.breakPolling = false;
return Observable.empty();
} else {
return response;
}
});
}
breakPolling() {
this.breakPolling = true;
return Observable.empty();
}
我派发一个将调用 breakPolling()
方法的操作并设置一个简单的布尔值。我只是 return 一个空的 Observable,而不是 return 将响应数据作为一个 Observable。
它不会取消请求,但会阻止传递其数据。它很丑,但它会修补。