问题
As you know it's possible to use Interceptors in new versions of Angular 4.
In mine, I want to cancel a request in interceptor in some conditions. So is it possible? or maybe what should I ask is, Which way I should do that?
Also It will be Ok! if I found a way to rewrite some response to the request instead of canceling it.
回答1:
I think all you have to do to cut the interceptor chain is to simply return an empty Observable
like so:
import { EMPTY } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return EMPTY;
}
return next.handle(request);
}
回答2:
Inspired by @RVP answer I have found out that it's possible to cut the chain with an error in the same simple way using Observable.throw()
//...
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequestWithError) {
return Observable.throw('Error message');
} else {
return next.handle(req);
}
}
This avoids fulfilling response promises with undefined values.
回答3:
This is just a slight variant of RVP's answer
import { NEVER } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return NEVER;
}
return next.handle(request);
}
I used NEVER
instead of EMPTY
to avoid dealing with undefined values in my subscriptions (or promises).
Use NEVER
if you don't want your subscription callback to be invoked
回答4:
@RVP's code will work, We can do one more thing for same.
add return
only, it will also work
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(helper.isTokenExpired(tokenVal)){
return;
}
.
. <{code}>
.
}
回答5:
To Angular 6, you need can user the following structure to return a empty Observable:
import {Observable} from 'rxjs';
import {empty} from 'rxjs/internal/Observer';
//...
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return Observable.create(empty);
} else {
return next.handle(req);
}
}
回答6:
let sub = this.http.get(url, {headers: reqHeaders})
.subscribe(
(res) => {
res = res.json();
}
);
sub.unsubscribe();
来源:https://stackoverflow.com/questions/46433953/how-to-cancel-current-request-in-interceptor-angular-4