Salut, j'utilise angular 6 pour appeler une api de repos avec le code ci-dessous. J'essaie de faire en sorte que le code soit synchrone avec la fonction asynchrone. Cependant, quelque chose manque
async save() {
if (this.changedRecords.length !== 0) {
this.post('/api/devices/update-devices', this.changedRecords).
then(x => { console.log("change"); console.log(`Resolved: ${x}`) });
}
if (this.newRecords.length !== 0) {
this.post('/api/devices/new-devices', this.newRecords).
then(x => { console.log("new"); console.log(`Resolved: ${x}`) });
}
if (this.deletedRecords != null) {
this.post('/api/devices/delete-devices', this.deletedRecords).
then(x => { console.log("deleted"); console.log(`Resolved: ${x}`) });
}
}
async post(url: string, list: DboDevice[]) {
var result;
if (list.length !== 0) {
await this.http.post(url, list).subscribe(result => {
result = true;
}, error => {
console.error(error);
result = false;
});
}
else {
result = true;
}
return result;
}
Cependant, lorsque j'exécute ce code, les valeurs retournent comme "Resolved: undefined" dans la console. Cela m'amène à croire que l'attente n'interrompt pas le programme dans la fonction post (). Qu'est-ce que je fais mal ici?
this.http.post
Angulaire renvoie un observable RxJS. L'appel de this.http.post(...).subscribe(...)
renvoie ensuite l'objet RxJS Subscription
. Aucun d'entre eux ne retourne donc Promise, vous ne pouvez donc pas les utiliser avec await
.
Si vous voulez pouvoir utiliser await
avec Observables, vous devez utiliser toPromise()
au lieu de subscribe()
qui renvoie une promesse qui est résolue avec la première valeur émise par ce Observable (il appelle en interne subscribe
pour vous et l'enveloppe avec un objet Promise
).
await this.http.post(...).toPromise(value => {
...
});
https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts#L342-L354