Причина:
Причина в том, 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 мы познакомились с машинописным текстом и наблюдаемыми объектами, поэтому мы надеемся, что этот ответ охватывает основы обработки асинхронного запроса с помощью наблюдаемых объектов.