ご存知のように、Angular 4の新しいバージョンでInterceptorsを使用することができます。
私の場合、いくつかの条件でインターセプターのリクエストをキャンセルしたいです。それは可能ですか?または多分私は尋ねるべきである、私はそれを行うべき方法は?
また、大丈夫です!リクエストをキャンセルする代わりに、リクエストへの応答を書き換える方法を見つけた場合。
インターセプターチェーンをカットするためにあなたがしなければならないことは、次のように単純に空の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's answerのわずかな変形です
import { NEVER } from 'rxjs';
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (stopThisRequest) {
return NEVER;
}
return next.handle(request);
}
サブスクリプション(またはプロミス)で未定義の値を処理しないように、NEVER
の代わりにEMPTY
を使用しました。
サブスクリプションコールバックを呼び出さない場合は、NEVER
を使用します
@RVPのコードは機能しますが、同じことをもう1つ実行できます。
return
のみを追加すると、それも機能します
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(helper.isTokenExpired(tokenVal)){
return;
}
.
. <{code}>
.
}
Angular 6にするには、次の構造を使用して空の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);
}
}