Angular 6 Async-await не работает по HTTP-запросу - PullRequest
0 голосов
/ 06 декабря 2018

Привет, я использую angular 6, чтобы вызвать api rest с кодом ниже.Я пытаюсь добиться синхронности кода с функцией async-await.однако чего-то не хватает

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;
  }

Однако, когда я запускаю этот код, значения возвращаются как «Resolved: undefined» в консоли.Это заставляет меня поверить, что ожидание не останавливает программу в функции post ().Что я здесь не так делаю?

1 Ответ

0 голосов
/ 06 декабря 2018

Angular's this.http.post возвращает наблюдаемый RxJS.Затем вызов this.http.post(...).subscribe(...) возвращает объект RxJS Subscription.Никто из них не возвращает Promise, поэтому вы не можете использовать их с await.

. Если вы хотите использовать await с Observables, вы должны использовать toPromise() вместо subscribe(), чтовозвращает Обещание, которое разрешается с помощью первого значения, испускаемого этим Наблюдаемым (оно для вас внутренне вызывает subscribe и оборачивает его объектом Promise).

await this.http.post(...).toPromise(value => {
  ...
});

https://github.com/ReactiveX/rxjs/blob/master/src/internal/Observable.ts#L342-L354

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...