8

I can get the connection status using window.navigator.onLine and using the HttpInterceptor as mentioned below i can get access to requests globally. But how do i cancel a request inside the HttpInterceptor? Or else is there a better way to handle this?

import { Injectable } from '@angular/core';
import {
    HttpRequest,
    HttpHandler,
    HttpEvent,
    HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class InternetInterceptor implements HttpInterceptor {
    constructor() { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        //check to see if there's internet
        if (!window.navigator.onLine) {
            return //cancel request
        }
        //else return the normal request
        return next.handle(request);
    }
}
Lakshin Karunaratne
  • 446
  • 1
  • 6
  • 19

2 Answers2

11

You were very close to the answer.

import { Injectable } from '@angular/core';
import {
    HttpRequest,
    HttpHandler,
    HttpEvent,
    HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class InternetInterceptor implements HttpInterceptor {
    constructor() { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // check to see if there's internet
        if (!window.navigator.onLine) {
            // if there is no internet, throw a HttpErrorResponse error
            // since an error is thrown, the function will terminate here
            return Observable.throw(new HttpErrorResponse({ error: 'Internet is required.' }));

        } else {
            // else return the normal request
            return next.handle(request);
        }
    }
}
Joyce
  • 437
  • 1
  • 8
  • 20
0
import { Injectable } from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class InternetInterceptor implements HttpInterceptor {
constructor() { }

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

    return next.handle(request).do((event: any) => {
        //
    }).catch(response => {
       //if (response instanceof HttpErrorResponse) {
       //check to see if there's internet
         if (!window.navigator.onLine) {
           return //cancel request
         }
       //}
       return Observable.throw(response);
    });
  }
}
Beller
  • 828
  • 1
  • 6
  • 19
  • Please add some explanations to your answer as well. – BlackBeard Feb 08 '18 at 10:42
  • This doesn't really handle what the question asks for because it will always send a request to the server - which no matters what will invoke `catch` when there is no internet. By the time you check for network status, the request has ended. – Joyce Mar 29 '18 at 04:14