Как отменить текущий запрос в interceptor-Angular 4

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

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

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

6 ответов


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

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

вдохновленный ответом @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}>
        .

    }

к угловому 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);
    }
}

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);
    }
}

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

sub.unsubscribe();