web-dev-qa-db-ja.com

インターセプターで現在のリクエストをキャンセルする方法-Angular 4

ご存知のように、Angular 4の新しいバージョンでInterceptorsを使用することができます。

私の場合、いくつかの条件でインターセプターのリクエストをキャンセルしたいです。それは可能ですか?または多分私は尋ねるべきである、私はそれを行うべき方法は?

また、大丈夫です!リクエストをキャンセルする代わりに、リクエストへの応答を書き換える方法を見つけた場合。

24
Behnam Azimi

インターセプターチェーンをカットするためにあなたがしなければならないことは、次のように単純に空のObservableを返すことだけだと思います。

import { EMPTY } from 'rxjs';

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  if (stopThisRequest) {
    return EMPTY;
  }

  return next.handle(request);
}
29
RVP

@RVPの答えに触発されて、Observable.throw()を使用して同じ簡単な方法でエラーのあるチェーンを切断できることがわかりました。

//...
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (stopThisRequestWithError) {
        return Observable.throw('Error message');
    } else {
        return next.handle(req);
    }
}

これにより、未定義の値で応答の約束を果たすことが回避されます。

6
veritas

これは 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を使用します

0
developer

@RVPのコードは機能しますが、同じことをもう1つ実行できます。

returnのみを追加すると、それも機能します

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
          if(helper.isTokenExpired(tokenVal)){
              return;
          }
        .
        . <{code}>
        .

    }
0
Kapil Thakkar

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);
    }
}
0
Ângelo Polotto