如何在拦截器中取消当前请求 - Angular 4
How to cancel current request in interceptor - Angular 4
如您所知,可以在 Angular 4.
的新版本中使用 拦截器
在我的情况下,我想在某些情况下取消拦截器中的请求。
那有可能吗?也许我应该问的是:我应该用什么方式来做?
如果我找到一种方法来重写对请求的某些响应而不是取消它,那也可以。
let sub = this.http.get(url, {headers: reqHeaders})
.subscribe(
(res) => {
res = res.json();
}
);
sub.unsubscribe();
我认为要切断拦截器链,您只需 return 一个空的 Observable
就像这样:
import { EMPTY } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return EMPTY;
}
return next.handle(request);
}
受@RVP 回答的启发,我发现可以使用 Observable.throw()
以同样简单的方式切断错误链
//...
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequestWithError) {
return Observable.throw('Error message');
} else {
return next.handle(req);
}
}
这避免了用未定义的值履行响应承诺。
@RVP 的代码可以工作,我们可以再做一件事。
仅添加return
,它也有效
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(helper.isTokenExpired(tokenVal)){
return;
}
.
. <{code}>
.
}
到Angular 6、你需要可以使用下面的结构来return一个空的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);
}
}
这只是 RVP's 回答
的一个细微变体
import { NEVER } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return NEVER;
}
return next.handle(request);
}
我使用 NEVER
而不是 EMPTY
来避免在我的订阅(或承诺)中处理未定义的值。
如果您不想调用订阅回调,请使用NEVER
如上所述,有更优化的方法来处理自定义响应的错误
import { throwError, Observable } from 'rxjs';
import { HttpEvent } from '@angular/common/http';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (authFailedDummy(request)) {
return throwError(new Error('Authorization error: The request did not go through'));
}
return next.handle(request);
}
嘿,我想我来晚了,但想分享一些额外的知识
如果你想在某个超时后取消请求,你可以在拦截器中使用 rxjs 超时运算符,它对每个请求都有效。
intercept(req: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<unknown>>
{
return next.handle(req).pipe(timeout(30000),
catchError((error: HttpErrorResponse) => {
return throwError({ error: error.name, message: error.message});
})) as Observable<HttpEvent<unknown>>
}
如您所知,可以在 Angular 4.
的新版本中使用 拦截器在我的情况下,我想在某些情况下取消拦截器中的请求。 那有可能吗?也许我应该问的是:我应该用什么方式来做?
如果我找到一种方法来重写对请求的某些响应而不是取消它,那也可以。
let sub = this.http.get(url, {headers: reqHeaders})
.subscribe(
(res) => {
res = res.json();
}
);
sub.unsubscribe();
我认为要切断拦截器链,您只需 return 一个空的 Observable
就像这样:
import { EMPTY } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return EMPTY;
}
return next.handle(request);
}
受@RVP 回答的启发,我发现可以使用 Observable.throw()
//...
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequestWithError) {
return Observable.throw('Error message');
} else {
return next.handle(req);
}
}
这避免了用未定义的值履行响应承诺。
@RVP 的代码可以工作,我们可以再做一件事。
仅添加return
,它也有效
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(helper.isTokenExpired(tokenVal)){
return;
}
.
. <{code}>
.
}
到Angular 6、你需要可以使用下面的结构来return一个空的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);
}
}
这只是 RVP's 回答
的一个细微变体import { NEVER } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return NEVER;
}
return next.handle(request);
}
我使用 NEVER
而不是 EMPTY
来避免在我的订阅(或承诺)中处理未定义的值。
如果您不想调用订阅回调,请使用NEVER
如上所述,有更优化的方法来处理自定义响应的错误
import { throwError, Observable } from 'rxjs';
import { HttpEvent } from '@angular/common/http';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (authFailedDummy(request)) {
return throwError(new Error('Authorization error: The request did not go through'));
}
return next.handle(request);
}
嘿,我想我来晚了,但想分享一些额外的知识
如果你想在某个超时后取消请求,你可以在拦截器中使用 rxjs 超时运算符,它对每个请求都有效。
intercept(req: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<unknown>>
{
return next.handle(req).pipe(timeout(30000),
catchError((error: HttpErrorResponse) => {
return throwError({ error: error.name, message: error.message});
})) as Observable<HttpEvent<unknown>>
}