Это связано с тем, что операции ввода-вывода обычно предназначены для неблокирования. Настройка запроса через http.get
является такой неблокирующей операцией. На завершение требуется время, и в то же время ваш другой код будет выполняться первым.
Вы бы не хотели, чтобы ваше приложение зависало, пока оно ожидает 5-секундного ответа от сервера, не так ли?
Если вы хотите отобразить свой результат, вы можете просто разделить свою логику для этого, например, так:
_weatherForecast: WeatherForecast = null;
calculateWeatherForecast() {
this.http.get<WeatherForecast>(this._url).subscribe((data) => {
this._weatherForecast = data;
});
}
getWeatherForecast() {
return this._weatherForecast;
}
Таким образом, вы можете получать свои данные независимо от их отображения. Angular обнаружит изменение вашей переменной и выдаст результат. В вашем шаблоне вы просто сделаете:
<div>{{getWeatherForecast()}}</div>
Преимущество этого заключается в том, что вы не будете получать новые данные с сервера каждый раз, когда хотите отобразить weatherForecast
. Это дает вам больше контроля над тем, как часто и когда запрашивать у вашего сервера новые данные.
Edit:
Как было указано в комментариях, код будет нарушен при попытке доступа к свойству (в данном случае summary
) на _weatherForecast
. Если вы хотите избежать этого, у вас есть два варианта:
- Измените ваш шаблон на:
<div>{{ getWeatherForecast()?.summary }}</div>
- Измените логику в вашем компоненте на:
getWeatherForecast() {
if(this._weatherForecast) {
return this._weatherForecast.summary;
}
}
Вы также можете изменить метод getWeatherForecast()
на get weatherForecast()
. Таким образом, вы можете получить к нему доступ в своем шаблоне как свойство вашего компонента, например:
<div>{{ weatherForecast?.summary }}</div>
Надеюсь, это поможет!