У меня есть служба, которая возвращает наблюдаемый объект, который выполняет HTTP-запрос на мой сервер и получает данные. Я хочу использовать эти данные, но всегда получаю undefined
. В чем проблема?
Сервис :
@Injectable()
export class EventService {
constructor(private http: Http) { }
getEventList(): Observable<any>{
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.get("http://localhost:9999/events/get", options)
.map((res)=> res.json())
.catch((err)=> err)
}
}
Составная часть:
@Component({...})
export class EventComponent {
myEvents: any;
constructor( private es: EventService ) { }
ngOnInit(){
this.es.getEventList()
.subscribe((response)=>{
this.myEvents = response;
});
console.log(this.myEvents); //This prints undefined!
}
}
Я проверил Как мне вернуть ответ от асинхронного вызова? опубликовать, но не смог найти решение
Ответы:
Причина:
Причина в том,
undefined
что вы выполняете асинхронную операцию. Это означает, что для завершенияgetEventList
метода потребуется некоторое время (в основном в зависимости от скорости вашей сети).Итак, давайте посмотрим на вызов http.
После того, как вы действительно сделаете ("выстрелите") ваш http-запрос,
subscribe
вы будете ждать ответа. Во время ожидания javascript выполнит строки под этим кодом, и если он обнаружит синхронные назначения / операции, он выполнит их немедленно.Итак, подписавшись на рассылку
getEventList()
и дождавшись ответа,console.log(this.myEvents);
строка будет выполнена немедленно. И его значение -
undefined
до того, как будет получен ответ от сервера (или того, что вы изначально инициализировали).Это похоже на выполнение:
Решение:
Итак, измените код на:
напечатает ответ .. через некоторое время.
Что ты должен делать:
С вашим ответом может быть что-то еще, кроме его регистрации; вы должны выполнять все эти операции внутри обратного вызова (внутри
subscribe
функции), когда поступают данные.Еще стоит упомянуть, что если вы пришли из
Promise
фона,then
обратный вызов соответствуетsubscribe
наблюдаемым.Чего делать не следует:
Вы не должны пытаться изменить асинхронную операцию на операцию синхронизации (не то чтобы вы могли). Одна из причин, по которой у нас есть асинхронные операции, заключается в том, чтобы не заставлять пользователя ждать завершения операции, пока он может делать другие вещи в этот период времени. Предположим, что выполнение одной из ваших асинхронных операций занимает 3 минуты, если бы у нас не было асинхронных операций, интерфейс завис бы на 3 минуты.
Предлагаемое чтение:
Первоначальная заслуга в этом ответе заключается в следующем: Как мне вернуть ответ от асинхронного вызова?
Но с выпуском angular2 мы познакомились с машинописным текстом и наблюдаемыми объектами, поэтому мы надеемся, что этот ответ охватывает основы обработки асинхронного запроса с помощью наблюдаемых объектов.
источник
Выполнение http-вызова в angular / javascript - это асинхронная операция. Поэтому, когда вы выполняете http-вызов, он назначает новый поток, чтобы завершить этот вызов и начать выполнение следующей строки с другим потоком. Вот почему вы получаете неопределенное значение. поэтому внесите изменения ниже, чтобы решить эту проблему
источник
Вы можете использовать asyncPipe если используете myEvents только в шаблоне.
Here пример с asyncPipe и Angular4 HttpClient пример
источник
Observables ленивы, поэтому вам нужно подписаться, чтобы получить значение. Вы правильно подписали его в своем коде, но одновременно регистрировали вывод вне блока «подписаться». Вот почему он «не определен».
Поэтому, если вы зарегистрируете его внутри блока подписки, он будет правильно записывать ответ.
источник
Здесь проблема, вы инициализации
this.myEvents
вsubscribe()
которых асинхронный блок в то время как вы делаетеconsole.log()
только изsubscribe()
блока. Таким образомconsole.log()
, вызов доthis.myEvents
инициализации.Пожалуйста, переместите код console.log () внутрь subscribe (), и все готово.
источник
Результат не определен, потому что angular обрабатывает async. вы можете попробовать, как показано ниже:
источник
Также убедитесь, что вы сопоставляете свой ответ с выходом json. В противном случае он вернет простой текст. Вы делаете это так:
источник
Не определено, потому что значение здесь регистрируется до того, как какие-либо данные из службы будут установлены из указанного выше вызова службы подписки. Поэтому вам нужно дождаться завершения вызова ajax и установить данные из данных ответа.
Здесь сделайте журнал консоли внутри метода подписки, который будет вести журнал, когда данные установлены в переменной myEvents.
источник
Вы можете просто попробовать этот метод -
источник