web-dev-qa-db-fra.com

Angular 6 Async-wait ne fonctionne pas sur la requête http

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?

8
Joshua Vandenbor

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

13
martin