2017-10-20 22 views
0

Je voulais écrire un service injectable en Angulaire qui peut intercepter tous les appels ajax. Fondamentalement avant ajaxStart et après fini. Je suis capable de réaliser par ce code-snippets. Mais je suis capable de le faire en utilisant la syntaxe es5. Comment puis-je faire la même chose en prolongeant XMLHttpRequest qui est montré dans le fichier n ° 3?Intercepter chaque http appelle une approche ES6

1) http-interceptor.ts

import { Injectable, Component, OnInit } from '@angular/core'; 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 

interface AjaxRequest { 
    url?: string; 
    requestCount?: number; 
    method?: string; 
} 

interface AjaxResponse { 
    url?: string; 
    requestCount?: number; 
    response?: string; 
} 

@Injectable() 
export class HttpInterceptor { 

    public ajaxStart = new BehaviorSubject<AjaxRequest>({}); 
    public ajaxStop = new BehaviorSubject<AjaxResponse>({}); 

    constructor() { 
     this.bootstrapAjaxInterceptor(); 
    } 

    private bootstrapAjaxInterceptor() { 

     const _self = this; 
     const originalOpen = XMLHttpRequest.prototype.open; 

     XMLHttpRequest.prototype.open = function (xhrMethod, requestUrl) { 

      _self.ajaxStart.next(requestUrl); 

      this.addEventListener('readystatechange', xhr => { 

       _self.ajaxStop.next(this.responseURL); 

      }, false); 

      originalOpen.apply(this, arguments); 
     }; 
    } 
} 

2) app-component.ts

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.scss'] 
}) 
export class AppComponent implements OnInit { 

    constructor(private httpInterceptor: HttpInterceptor) { } 

    ngOnInit() { 

     this.httpInterceptor.ajaxStart.subscribe(url => { 
      console.log('ajaxStart : ', url); 
     }); 

     this.httpInterceptor.ajaxStop.subscribe(url => { 
      console.log('ajaxStop : ', url); 
     }); 
    } 
} 

3) http-interceptor.ts

@Injectable() 
export class HttpInterceptor extends XMLHttpRequest { 

    open(xhrMethod, requestUrl) { 
     // Equivalent to XMLHttpRequest.prototype.open 
     // Now how to handle `readystatechange` 
    } 

    ajaxStart() { } 

    ajaxStop() { } 
} 
+0

Merci @Bahrampour pour les corrections. Si vous sentez que c'est une bonne question. Pourriez-vous l'augmenter? –

Répondre

1

Peut-être quelque chose comme ça ?

class HttpInterceptor extends XMLHttpRequest { 
    onreadystatechange =() => { 
    switch (this.readyState) { 
     case 1: 
     this.ajaxStart(); 
     break; 
     case 4: 
     this.ajaxStop(); 
     break; 
    } 
    } 

    ajaxStart() { 
    console.log('operation started.'); 
    } 

    ajaxStop() { 
    console.log('operation completed.'); 
    } 
} 

const interceptor = new HttpInterceptor(); 

interceptor.open('GET', 'https://developer.mozilla.org/'); 
interceptor.send(); 
+0

Impossible de s'initialiser via DI en angulaire ou par 'const interceptor = new HttpInterceptor();' Il lance 'ERROR TypeError: Impossible de construire 'XMLHttpRequest': Veuillez utiliser l'opérateur 'new', ce constructeur d'objet DOM ne peut pas être appelé en tant que fonction'' –

+0

Salut @dork votre réponse m'a donné de petits indices si vous avez upvoted mais toujours à la recherche de la bonne solution. Si vous pensez que c'est une bonne question, n'hésitez pas à modifier ma question pour obtenir la réponse rapidement. –