Как отменить текущий запрос в перехватчике - Угловой 4

Как вы знаете, можно использовать Interceptors в новых версиях Angular 4.

В моем случае я хочу отменить запрос в перехватчике в некоторых условиях. Так это возможно? или, может быть, я должен спросить, как я должен это делать?

Также будет хорошо! если я нашел способ переписать некоторый ответ на запрос вместо его отмены.

Ответ 1

Я думаю, что все, что вам нужно сделать, чтобы разрезать цепочку перехватчиков, это просто вернуть пустой Observable например, так:

import { EMPTY } from 'rxjs';

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

  return next.handle(request);
}

Ответ 2

Вдохновленный ответом @RVP, я обнаружил, что можно просто обрезать цепочку с ошибкой с помощью Observable.throw()

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

Это позволяет избежать выполнения обещаний ответа с неопределенными значениями.

Ответ 3

@RVP-код будет работать, мы можем сделать еще одну вещь для этого.

добавьте return только, он также будет работать

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

    }

Ответ 4

Для Углового 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);
    }
}

Ответ 5

Per RXJS 6: новая версия HttpInterceptor:

import { EMPTY } from 'rxjs';

//...

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

Ответ 6

Это всего лишь небольшой вариант ответа RVP

import { NEVER } from 'rxjs';

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

  return next.handle(request);
}

Я использовал NEVER вместо EMPTY чтобы избежать использования неопределенных значений в моих подписках (или обещаниях)

Ответ 7

let sub = this.http.get(url, {headers: reqHeaders})
            .subscribe(
                (res) => {
                    res = res.json();
                }
            );

sub.unsubscribe();