Причина:
Причина в том, undefinedчто вы выполняете асинхронную операцию. Это означает, что для завершения getEventListметода потребуется некоторое время (в основном в зависимости от скорости вашей сети).
Итак, давайте посмотрим на вызов http.
this.es.getEventList()
После того, как вы действительно сделаете ("выстрелите") ваш http-запрос, subscribeвы будете ждать ответа. Во время ожидания javascript выполнит строки под этим кодом, и если он обнаружит синхронные назначения / операции, он выполнит их немедленно.
Итак, подписавшись на рассылку getEventList()и дождавшись ответа,
console.log(this.myEvents);
строка будет выполнена немедленно. И его значение - undefinedдо того, как будет получен ответ от сервера (или того, что вы изначально инициализировали).
Это похоже на выполнение:
ngOnInit(){
setTimeout(()=>{
this.myEvents = response;
}, 5000);
console.log(this.myEvents); //This prints undefined!
}
Решение:
Так как же решить эту проблему? Мы будем использовать функцию обратного вызова, которая является subscribeметодом. Потому что, когда данные приходят с сервера, они будут внутри subscribeс ответом.
Итак, измените код на:
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
console.log(this.myEvents); //<-- not undefined anymore
});
напечатает ответ .. через некоторое время.
Что ты должен делать:
С вашим ответом может быть что-то еще, кроме его регистрации; вы должны выполнять все эти операции внутри обратного вызова (внутри subscribeфункции), когда поступают данные.
Еще стоит упомянуть, что если вы пришли из Promiseфона, thenобратный вызов соответствует subscribeнаблюдаемым.
Чего делать не следует:
Вы не должны пытаться изменить асинхронную операцию на операцию синхронизации (не то чтобы вы могли). Одна из причин, по которой у нас есть асинхронные операции, заключается в том, чтобы не заставлять пользователя ждать завершения операции, пока он может делать другие вещи в этот период времени. Предположим, что выполнение одной из ваших асинхронных операций занимает 3 минуты, если бы у нас не было асинхронных операций, интерфейс завис бы на 3 минуты.
Предлагаемое чтение:
Первоначальная заслуга в этом ответе заключается в следующем: Как мне вернуть ответ от асинхронного вызова?
Но с выпуском angular2 мы познакомились с машинописным текстом и наблюдаемыми объектами, поэтому мы надеемся, что этот ответ охватывает основы обработки асинхронного запроса с помощью наблюдаемых объектов.