Почему локальная переменная не инициализируется с блока subscribe?

getItems(): Observable<Item[]> {
    return this.http.get<Item[]>('./assets/data/data.json');
}

У меня есть код, который возвращает Observable. Ниже другой компонент, в котором вызывается первая функция. Я подписываюсь и получаю данные.

ngOnInit(): void {
    this.itemService.getItems().subscribe(i => this.items = i);

    console.log(this.items);
}

Но когда вызываю ту же функцию в сервисе, где написан метод, при инициализации локальной переменной она остаётся undefined

let items: Item[];
...

    this.getItems().subscribe(i => items = i);

При отладке console.log() в блоке subscribe() данные все есть. В чём проблема? Читал несколько статей, в одной парень расписал всё детально. Но я так и не понял в чём проблема.


Ответы (1 шт):

Автор решения: Alexander Chernin

Потому что subscribe это асинхронная функция, которая не обязательно вызовется перед console.log (а вероятнее всего, в реальном проекте, после). Надо делать так:

ngOnInit(): void {
    this.itemService.getItems().subscribe(
        i => {
            this.items = i;
            console.log(this.items);
        }
    );    
}

Смысл данной конструкции в том, чтобы сделать запрос данных (например, с сервера) и, не дожидаясь ответа (и не блокируя выполнение кода приложения), продолжить выполнение программы дальше без задержек. Когда данные будут получены вызовется метод subscribe объекта класса Observable

→ Ссылка