I am using a global spinner on angular over regular HTTP calls.
Loader Interceptor
import { Injectable } from '@angular/core';
import {
HttpResponse,
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { LoaderService } from '../services/loader.service';
@Injectable()
export class LoaderInterceptor implements HttpInterceptor {
private requests: HttpRequest<any>[] = [];
constructor(private loaderService: LoaderService) { }
removeRequest(req: HttpRequest<any>) {
const i = this.requests.indexOf(req);
if (i >= 0) {
this.requests.splice(i, 1);
}
this.loaderService.isLoading.next(this.requests.length > 0);
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.requests.push(req);
console.log("No of requests--->" + this.requests.length);
this.loaderService.isLoading.next(true);
return Observable.create(observer => {
const subscription = next.handle(req)
.subscribe(
event => {
if (event instanceof HttpResponse) {
this.removeRequest(req);
observer.next(event);
}
},
err => {
alert('error' + err);
this.removeRequest(req);
observer.error(err);
},
() => {
this.removeRequest(req);
observer.complete();
});
// remove request from queue when cancelled
return () => {
this.removeRequest(req);
subscription.unsubscribe();
};
});
}
}
Loader Service
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class LoaderService {
public isLoading = new BehaviorSubject(false);
constructor() { }
}
Loader Component
import { Component, OnInit } from '@angular/core';
import { LoaderService } from '../../services/loader.service';
@Component({
selector: 'app-my-loader',
templateUrl: './my-loader.component.html',
styleUrls: ['./my-loader.component.css']
})
export class MyLoaderComponent implements OnInit {
loading: boolean;
constructor(private loaderService: LoaderService) {
this.loaderService.isLoading.subscribe((v) => {
console.log(v);
this.loading = v;
});
}
ngOnInit() {
}
}
I have some URLs that loads dynamically whenever a new notification is triggered, what I want is to avoid these specific calls from the loader to prevent the spinner from showing on these specific requests.
There are a couple of ways you can avoid the interceptor & it will depend on your requirements as to which you pick.
You can use HttpBackend
to make the API call instead of HttpClient
. This works by skipping your interceptors, it will therefore skip ALL your interceptors which may or may not be problematic for you.
You can pass an extra argument in your request, skipLoadingInterceptor: boolean
for example and if this is present you can skip over the logic in your interceptor that is responsible for setting the loading animation.