2017-06-16 1 views
2

J'ai besoin d'un ID utilisateur dans presque toutes les demandes REST. Lorsque je me connecte à un utilisateur, je passe le jeton au stockage local et l'ID à user.service.ts (par la fonction setUserId (userId);) mais lorsque j'authentifie l'utilisateur uniquement par jeton (l'utilisateur est connecté mais la page était rafraîchie) J'essaie d'obtenir userId de l'objet User (obtenir l'objet utilisateur à partir de la requête REST par token).

Cette partie de mon code ressemble à ceci:

getUser() { 
    var authToken = localStorage.getItem('authorization') 

    if(!this.userPromise){ 
     let headers = new Headers(); 
     headers.append('Content-type', 'application/json'); 
     headers.append('Authorization', authToken); 

     this.userPromise = this.http.get(
     'http://localhost:8080/api/user', 
     { headers } 
    ).toPromise() 
     .then((res) => res.json()); 
    } 

    return this.userPromise; 
    }; 




getUserId(){ 
    var $self = this; 

    if($self.userId){ 
     return $self.userId; 
    } else { 
     $self.getUser().then(function(result){ 
     $self.setUserId(result.id); 
     console.log(result.id); 
     return result.id; 
     }); 
    } 
    } 

Lorsqu'une demande demander l'ID utilisateur j'utiliser GetUserID() et je vérifie si l'utilisateur Id est défini. Si est défini, je réponds à ces données, mais sinon - je veux obtenir ces données de la fonction getUser().

Je ne peux pas résoudre un problème - cette demande est asynchrone et par exemple le service "tâche" définit la valeur userId comme non défini - n'attend pas sur cette nouvelle valeur.

Comment puis-je gérer ce problème?

--- EDIT

location est une demande - il doens't attendre la réponse;

getUserTasks() { 
    // return this.userService.getUserId(); 
    var userId = this.userService.getUserId(); 

    return this.http.get(
     'http://localhost:8080/api/private/'+userId+'/tasks' 
     // 'http://localhost:8080/api/private/1/tasks' 
    ) 
    .toPromise() 
     .then((res) => res.json()); 
    } 
+0

pourriez-vous fournir un plnker s'il vous plaît? –

+0

Pouvez-vous montrer comment vous utilisez la valeur dans le modèle? Je peux donc vous donner le moyen le plus rapide de l'atteindre. Vous semblez faire trop de travail pour une petite tâche. –

+0

Dans mon modèle, j'ai seulement ceci: {{data | async}} Je sais - je peux charger everythink en frame avec ng-if = "user.id" mais ce n'est pas une bonne solution dans ce cas. –

Répondre

2

J'ai trouvé des solutions - que l'on pense à faire est une bonne façon d'utiliser async/Attendent fonction sur getUserTasks():

async getUserTasks() { 
    let userId = await this.userService.getUserId(); 

    return this.http.get(
     'http://localhost:8080/api/private/'+userId+'/tasks' 
    ) 
    .toPromise() 
    .then((res) => res.json()); 
    } 

--- EDIT ---

Enfin - Si quelqu'un trouve le même problème, je déplace mon niveau de changement vers le processus d'authentification. De cette façon, j'ai accès à userId à partir de n'importe quelle partie de mon application par les services UserService.getUserId();

Lorsque l'utilisateur se connecte, j'ai le temps de mettre toutes les données à variable, mais lorsque je ne fais que l'authentification, je modifie la fonction isLoggedIn() pour qu'elle soit asynchrone/en attente. S'il existe un ticket, j'envoie une demande d'authentification pour obtenir l'objet Utilisateur.

Si j'obtiens un objet utilisateur, je renvoie true et place userId dans les services userId. Quand j'obtiens une erreur (aucune information d'identification), je fais une action de déconnexion dans la fonction getUser().

Je pense que ce sont les meilleures solutions - il fournit toutes les données nécessaires et donne un processus de vérification supplémentaire en garde.

async isLoggedIn() { 
    var $self = this; 

    if(localStorage.getItem("authorization")){ 
     var user = await $self.getUser(); 
     this.setUserId(user.id); 

     return true; 
    } else { 
     return false; 
    } 
    } 
+0

Heureux d'entendre, Juste pour vous le faire savoir, async/away utilise des promesses sous le capot. [ici] (https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8) est un bon article si vous voulez en savoir plus à ce sujet –

+0

Merci pour votre aide @Omri Luzon –