async / await в Angular `ngOnInit` - PullRequest
4 голосов
/ 11 мая 2019

В настоящее время я оцениваю плюсы и минусы замены Angular.RxJS 'Observable с простым Promise, чтобы я мог использовать async и await и получить более интуитивно понятный стиль кода.

Один из наших типичных сценариев: загрузка некоторых данных в ngOnInit.Используя Observables, мы делаем:

ngOnInit () {
  this.service.getData().subscribe(data => {
    this.data = this.modifyMyData(data);
  });
}

Когда вместо этого я возвращаю Promise из getData() и использую async и await, он становится:

async ngOnInit () {
  const data = await this.service.getData();
  this.data = this.modifyMyData(data);
}

Теперь, очевидно, Angular не будет «знать», что ngOnInit стало async.Я чувствую, что это не проблема: мое приложение по-прежнему работает, как и раньше.Но когда я смотрю на интерфейс OnInit, функция явно не объявлена ​​таким образом, что можно было бы предположить, что она может быть объявлена ​​async:

ngOnInit(): void;

Итак - нижняя строка: так ли эторазумно, что я здесь делаю?Или у меня возникнут непредвиденные проблемы?

1 Ответ

6 голосов
/ 11 мая 2019

Это ничем не отличается от того, что у вас было раньше.ngOnInit вернет Обещание, и вызывающий абонент проигнорирует это обещание.Это означает, что вызывающая сторона не будет ждать, пока все в вашем методе завершится, прежде чем он продолжит работу.В данном конкретном случае это означает, что представление завершит настройку, и представление может быть запущено до установки this.data.

Это та же ситуация, что и раньше.Звонящий не будет ждать окончания ваших подписок и, возможно, запустит приложение до того, как будет заполнено this.data.Если ваше мнение основано на data, то, скорее всего, у вас есть какая-то настройка ngIf, чтобы предотвратить доступ к нему.

Лично я не считаю это неловким или плохим занятием, пока вызнаете о последствиях.Тем не менее, ngIf может быть утомительным (они будут необходимы в любом случае).Я лично перешел на использование преобразователей маршрутов, где это имеет смысл, чтобы я мог избежать этой ситуации.Данные загружаются до того, как маршрут завершает навигацию, и я могу знать, что данные доступны до того, как будет загружен вид.

...