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。

它不会取消请求,但会阻止传递其数据。它很丑,但它会修补。