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