Проблема связана с размещением этих двух строк:
this.restApiOwner.getOwners().subscribe(Owners=> this.owners=Owners);
console.log(this.owners);
Предположим, что для возврата данных из вызова getOwners()
требуется 5 полных секунд, в течение этого времени JavaScript будетне ждать, пока данные вернутся . Таким образом, console.log(this.owners)
будет выполнено сразу после того, как вызов подписки «настроен», где this.owners
еще не был назначен, и, таким образом, undefined
будет распечатано. Вы можете убедиться в этом, сделав вашу сеть очень медленной, используя devtools, и заметите, что распечатка undefined
будет напечатана почти мгновенно, даже если сетевой вызов ничего не дал.
Как и при любой асинхронной операции сJavaScript / TypeScript, есть элемент «обратного вызова», который необходимо выполнить. Нет такой вещи, как ожидание с JS как однопоточного и не может позволить себе ждать.
Для обработки асинхронных обратных вызовов могут использоваться следующие подходы:
- обратные вызовы - подход старой школы
- обещания - более распространенный подход, более простой в цепочке
- асинхронный / ожидание - aдругой подход «синтаксис-сахар» к обещаниям, из-за которого код выглядит «ожидающим», но это не так.
- Observables - в Angular observables обрабатываются библиотекой rxjs, которые по сути обещают стероиды.
Поскольку Angular предоставляет rxjs для обработки асинхронного кода, а вы уже используете его, я рекомендую изменить код на следующее:
this.restApiOwner.getOwners().subscribe(Owners=> {
this.owners=Owners;
console.log(this.owners);
});
Это работает, поскольку журнал будетнапечатано после данные возвращаются. Технически ваш код всегда работал, но console.log был просто не в том месте и работал не в то время.
Наконец, я рекомендую прочитать больше о том, как JS обрабатывает асинхронные операции в целом, как его ключ. основа языка. Вот mdn статья на тему