如何在拦截器中取消当前请求-Angular 4
正如您所知,在Angular 4的新版本中可以使用拦截器 在我的例子中,我想在某些情况下取消拦截器中的请求。 那有可能吗?或者我应该问的是,我应该怎么做如何在拦截器中取消当前请求-Angular 4,angular,angular-http-interceptors,Angular,Angular Http Interceptors,正如您所知,在Angular 4的新版本中可以使用拦截器 在我的例子中,我想在某些情况下取消拦截器中的请求。 那有可能吗?或者我应该问的是,我应该怎么做 也会好的!如果我找到一种方法来重写对请求的响应,而不是取消它。我认为要切断拦截器链,只需返回一个空的可观察的,如下所示: let sub = this.http.get(url, {headers: reqHeaders}) .subscribe( (res) => {
也会好的!如果我找到一种方法来重写对请求的响应,而不是取消它。我认为要切断拦截器链,只需返回一个空的
可观察的
,如下所示:
let sub = this.http.get(url, {headers: reqHeaders})
.subscribe(
(res) => {
res = res.json();
}
);
sub.unsubscribe();
import { EMPTY } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return EMPTY;
}
return next.handle(request);
}
从'rxjs'导入{EMPTY};
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
如果(停止此请求){
返回空;
}
下一步返回。处理(请求);
}
受@RVP answer的启发,我发现可以使用Observable.throw()以同样简单的方式切断带有错误的链条。
/。。。
截取(req:HttpRequest,next:HttpHandler):可观察{
如果(停止此请求){
返回可观察的.throw('Error message');
}否则{
返回next.handle(req);
}
}
这避免了用未定义的值来实现响应承诺。@RVP的代码可以工作,我们可以为同样的结果做更多的事情 仅添加
return
,它也可以工作
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(helper.isTokenExpired(tokenVal)){
return;
}
.
. <{code}>
.
}
intercept(req:HttpRequest,next:HttpHandler):可观察{
if(helper.isTokenExpired(tokenVal)){
返回;
}
.
.
.
}
对于Angular 6,您需要使用以下结构来返回空的可观测值:
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);
}
}
从'rxjs'导入{Observable};
从'rxjs/internal/Observer'导入{empty};
//...
截取(req:HttpRequest,next:HttpHandler):可观察{
如果(停止此请求){
返回可观察。创建(空);
}否则{
返回next.handle(req);
}
}
这只是答案的一个微小变化
从'rxjs'导入{NEVER};
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
如果(停止此请求){
永不回头;
}
下一步返回。处理(请求);
}
我使用了NEVER
而不是EMPTY
,以避免处理订阅(或承诺)中未定义的值
使用
从不
如果您不想像上面建议的那样调用订阅回调,则有更理想的方法通过自定义响应处理错误
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'导入{throwError,Observable};
从'@angular/common/http'导入{HttpEvent};
拦截(请求:HttpRequest,下一步:HttpHandler):可观察{
如果(授权失败摘要(请求)){
return-throwerr(新错误(“授权错误:请求未通过”);
}
下一步返回。处理(请求);
}
你所说的“重写一些响应”是什么意思?在处理请求之前编辑请求很容易,如果这是您的意思的话。文档中有一个例子:我提到这一点是因为我在中看到了angularjs中的一些功能。@JBNizet我反复查看了文档!我想这一个是没有提到的文件或可能我看不到它!我想要的是取消一个请求,或者重写另一个响应,而不是从服务器得到的响应。为其提供服务,而不是将请求转发给下一个处理程序。因此,它会返回缓存响应,而不是将请求发送到服务器。谢谢您的回答,但这不是解决方案!这不能在拦截器中完成,因为你没有订阅,但是有HttpRequest。@maximeMorin,是的,你可以,如果你可以返回一个可观察的,你可以返回一个可观察的,告诉你的订阅者取消订阅。在一个场景中,假设我有两个rxJS请求同时执行到后端,我想阻止其中一个,我怎样才能用拦截器做到这一点@RXJS 6的RVP只需从“RXJS”导入{EMPTY}并返回EMPTY。仅供参考,rxjs中的EMPTY与EMPTY不同。如何在httpclient中拦截响应时取消响应,Observable.EMPTY()不适用working@Codehan25这种逻辑你必须自己想出来。您可以使用DI在拦截器中注入您想要的任何服务,并根据应用程序库中的可用状态来建立逻辑,这正是我所寻找的,对我帮助很大:)在一个场景中,假设我有两个rxJS请求同时执行到后端,我想停止其中一个,我怎样才能用拦截器做到这一点呢?这个答案(在RxJS的当前版本中使用throwError)是唯一对我有用的东西。正如其他人所说,EMPTY有一些令人讨厌的副作用,因为等待结果的代码从未运行过。throwError(…)
now@Codehan25这只是我提出的一个变量,你需要根据需要自行设置条件。请详细说明什么是可观察的。创建(空);Empty是一个RxJs观察者,它取消请求,但仍然返回一个有效的观察者。您可以通过这个导入将他添加到您的项目中:从'rxjs/internal/Observer'导入{empty};这对我不起作用-出现错误“您提供了预期流的‘未定义’位置。您可以提供可观察、承诺、数组或可引用。”在angular universal中使用此选项,应用程序将卡住并继续等待请求解决。
import { NEVER } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return NEVER;
}
return next.handle(request);
}
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);
}