Ajoutez un wait à votre _personService.getPersonById puisqu'il renvoie une promesse.
Le fichier console.log ne sera envoyé qu'une fois l'attente précédente terminée.
public async ngOnInit() {
await this._personService.getPersonById(personId)
.then(person => this.person = person)
.catch(err => console.log(err));
console.log(this.person);
if (this.person) {
await this._teamService.getTeamById(this.person.teamId)
.then(teamData => this.team = teamData)
.catch(err => {
// note curlys allow multiple statments.
// do work with error, log it etc..
}
}
}
En ce qui concerne la valeur en HTML et non en mode console. La liaison de données HTML affichera le résultat de Promise dès qu'il aura la valeur. Le fichier console.log est appelé immédiatement (quelques ms) après getPersonById et lorsqu'il n'est pas en attente, il n'a pas la valeur à ce moment précis.
Voici comment faire ceci en imbriquant les fonctions. Notez le async person
.
public async ngOnInit() {
await this._personService.getPersonById(personId)
.then(async person => {
// To Use await inside .then, add async like above
this.person = person;
await this._teamService.getTeamById(this.person.teamId)
.then(teamData => this.team = teamData)
.catch(err => console.log(err));
})
.catch(err => console.log(err));
console.log(this.person);
Lorsque vous appelez une fonction qui renvoie une promesse, alors sera appelé après la première promesse est résolu .. Et .thens suivantes (vous pouvez les ajouter). Les thens fonctionnent toujours de manière synchrone. Trop de cela s'appelle 'chaînage' et est perçu comme un mauvais design. Thens sont séquentiels/synchrones, peu importe si vous utilisez en attente ou non.
Si vous voulez que les fonctions de l'outter attendent (ou 'bloquent') pour qu'elles s'exécutent également de manière synchrone, vous les attendez également.
Dernière édition: Je suggère d'utiliser le suivant copié d'un autre SO answer pour en savoir plus sur async/await.
utilisant:
public delay(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
Appelez le suivant et notez l'ordre de la sortie .. Ajouter et le changement attend pour apprendre comment il se comporte.
public async someFcn() {
console.log('1');
this.delay(2000)
.then(x => console.log('2'));
console.log(3)
await this.delay(1000)
.then(x => console.log('4')
.then(x => console.log('5');
console.log('Done');
}
Merci pour l'explication, j'ai essayé comme ci-dessous et il les erreurs que « ne peut pas lire la propriété « teamid » undefined » parce que la valeur d'entrée « this.person.teamId » ne sont pas disponibles. this._teamService.getTeamById (this.person.teamId) .then (teamData => {if (this.personnel! == indéfini) {this.team = teamData; }}); –
Je ne suis pas capable de penser à d'autres alternatives qui pourraient éviter le problème de rappel, toute aide serait grandement appréciée. –
Merci. J'ai ajouté "console.log" pour vérifier la valeur this.person.teamId car j'obtiens une erreur sur les outils de développement du navigateur comme "Impossible de lire la propriété 'teamId'". J'ai ajouté attendre comme vous l'avez démontré et il me donne une erreur de compilation comme "Ne trouve pas de nom d'attente" Je suis nouveau à ANgular2, pouvez-vous s'il vous plaît me corriger. Merci –