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