Вы совершенно не понимаете, как асинхронные методы взаимодействуют с остальной частью вашего синхронного кода.Я сломаю ваш первый код для вас.
//call the http service and use it to perform an HTTP GET.
//This is an asynchrounous call, meaning it out does not lock the rest of the application.
//The HTTP GET call starts, then the rest of your code runs.
const data = this.http.get('https://reqres.in/api/users?page=1')
//At this point, the HTTP GET has started, but since it is async, we do not wait for it to finish.
//So we log users. Users is CURRENTLY undefined (since our call hasn't finished yet.
console.log(this.users);
//After some (indeterminate) quantity of time, our HTTP GET finishes it's call.
//Now that it has finished its call, we perform the callback within the subscription.
//The subscription is an observable because it emits an event when it is finished.
//In our callback, we set the value of users.
.subscribe(res => this.users = JSON.stringify(res));
Как уже упоминалось, есть несколько способов решить проблему.Вы можете использовать async / await (что является функцией ES8), чтобы задержать консольный журнал пользователей, пока ваш HTTP GET не завершит свой вызов.Это тот же код, который предоставил @Mateusz.Это не правильный способ справиться с ситуацией, но async / await - это функция JS, которую вы должны понимать.
async getUsers() {
this.users = await this.http.get('https://reqres.in/api/users?page=1').toPromise();
console.log(this.users);
}
Кроме того, вы можете реструктурироватьваш код, чтобы использовать пользовательские данные в то время как в обратном вызове наблюдаемого.Это, вероятно, лучший способ справиться с ситуацией.Вам нужно будет переделать свой код, чтобы он мог обрабатывать результат асинхронного вызова при его выходе с сервера.Простое помещение вашего журнала в обратный вызов решает текущую проблему, но вам нужно подумать о других сценариях, особенно о том, как вы используете пользовательские данные.
this.http.get('https://reqres.in/api/users?page=1').subscribe(res => {
this.users = JSON.stringify(res);
console.log(this.users);
});