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());
}
pourriez-vous fournir un plnker s'il vous plaît? –
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. –
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. –