2017-03-20 2 views
0

J'ai créé un client http où j'ovverride la méthode post http:Angular2 abonnez-vous à deux reprises

post(url, data):Observable<Response> { 
    let headers = new Headers(); 
    this.createAuthorizationHeader(headers); 
    var response = this.http.post("\\services" + url, data, { 
     headers: headers 
    }); 

    return this.handleResponse(response); 
} 

private handleResponse(responseO : Observable<Response>) : Observable<Response> { 
    responseO.do(response => 
    { 
     if (response.url.includes("LoginPage.html")) { 
      window.location.replace("../LoginPage.html"); 
     } 
    }); 

    return responseO; 
} 

Alors Dans mon service, j'ABONNER:

return this.http.post("/dummy", params).subscribe(response => callback(response.json())); 

Dans mon httpClient si je retourne la réponse au lieu de handleResponse (réponse) tout fonctionne bien. Ce dont j'ai besoin est cependant pour toutes mes demandes de faire la vérification dans le responseO.do (..) en plus du comportement actuel.

J'ai également essayé response.share(); et abonnez-vous à cet objet mais cela ne fonctionne pas non plus.

Existe-t-il un moyen de réaliser ce que je cherche? Merci.

Répondre

1

Bien sûr, vous n'êtes pas abonné à l'Observable avec l'intercepteur do. Retour le Observable avec l'intercepteur do:

post(url, data):Observable<Response> { 
    let headers = new Headers(); 
    this.createAuthorizationHeader(headers); 
    var response = this.http.post("\\services" + url, data, { 
     headers: headers 
    }); 

    return this.handleResponse(response); 
} 

private handleResponse(responseO : Observable<Response>) { 
    return responseO.do(response => { 
     if (response.url.includes("LoginPage.html")) { 
      window.location.replace("../LoginPage.html"); 
     } 
    }); 
} 
1

Si vous souhaitez manipuler les données de flux de observables, au lieu d'utiliser do, vous devriez probablement utiliser map. C'est la manière la plus «réactive» de manipuler un flux.

post(url, data):Observable<Response> { 
    let headers = new Headers(); 
    this.createAuthorizationHeader(headers); 
    var response = this.http.post("\\services" + url, data, { 
     headers: headers 
    }); 

    return response.map(res => handleResponse(res)); 
} 

private handleResponse(responseO : Response) : Response { 
    if (response.url.includes("LoginPage.html")) { 
     window.location.replace("../LoginPage.html"); 
    } 

    return responseO; 
} 

Je voudrais également recommander contre l'utilisation window.location.replace dans une 2 application angulaire, car il forcera la page à rafraîchir, ce qui signifie avoir à redémarrer l'application. Si vous utilisez le routeur Angular pour modifier l'itinéraire, vous ne devrez pas attendre le chargement de l'application lorsque vous naviguez.