Когда я создаю перехватчик в angular5, как я могу позволить запросу делать это нормально? - PullRequest
0 голосов
/ 02 мая 2018
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpResponse, HttpHeaders, HttpErrorResponse} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import {NgbModal} from '@ng-bootstrap/ng-bootstrap';
import { ErrormodalComponent } from '../../features/errormodal/errormodal.component';
import { UploadComponent } from '../../features/upload/upload.component';


@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
  constructor(private _ngbModal: NgbModal) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).do((event: HttpEvent<any>) => {
      // What to do here?
    }, (err: any) => {
      if(err instanceof HttpErrorResponse) {
        switch(err.status) {
          case 404:
            // API not found
            console.log('launch')
            this._ngbModal.open(UploadComponent, {size: 'lg', backdrop: 'static' })
            break
        }

        console.log('err', err)
      }
    })

  }
}

Я получаю часть ошибки, но что мне делать там, где у меня есть What to do here? в случае нормального, не ошибочного запроса / ответа?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018
Try something like this:

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next
      .handle(request)
      .map((response: HttpEvent<any>) => {
        if (response instanceof HttpResponse) {

// Here if you want to parse your response you can do it otherwise just let it flow
          return response;
        }
      })
      .catch((response: HttpEvent<any>) => {
        if (response instanceof HttpErrorResponse) {

          return response;
        }
      });
  }
0 голосов
/ 02 мая 2018

Я рекомендую использовать оператор catch вместо do:

import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpResponse, HttpHeaders, HttpErrorResponse} from '@angular/common/http';
import { Observable } from 'rxjs';
import {NgbModal} from '@ng-bootstrap/ng-bootstrap';
import { ErrormodalComponent } from '../../features/errormodal/errormodal.component';
import { UploadComponent } from '../../features/upload/upload.component';


@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
  constructor(private _ngbModal: NgbModal) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).catch((err :  HttpErrorResponse) => {
        switch(err.status) {
          case 404:
            // API not found
            console.log('launch')
            this._ngbModal.open(UploadComponent, {size: 'lg', backdrop: 'static' })
            break
        }

        console.log('err', err);
        return Observable.throw(err);
      });

    }

  }

вам нужно добавить сервис ErrorInterceptor в раздел поставщиков модулей приложения, как это

providers :[
     { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true },
]
...