Полагаю, console.log(this.products[1].prodName);
- это строка с ошибкой.Ваш this.http.get<Cart[]>(this.url)
происходит асинхронно и будет запускать код после него перед запуском обратных вызовов внутри subscribe
.Сетевые запросы (и другие асинхронные вещи) занимают время, и JavaScript был разработан для обработки асинхронных вещей, добавляя их в цикл обработки событий, который будет выполняться позже, когда они завершатся, и не блокирует выполнение остального кода.
Так что this.total=getTotal(this.products);
и console.log(this.products[1].prodName);
запускаются до запуска this.products = res;
, в результате чего this.products
остается пустым массивом, когда вы пытаетесь прочитать второй элемент из него.
Читаем о том, какасинхронная работа работает в JavaScript и то, как Promises, async / await и / или Observables могут быть использованы для обработки асинхронных вещей, может быть полезно (похоже, что Angular сильно зависит от Observables).Поначалу это может немного сбивать с толку, но вы привыкли обрабатывать асинхронные вещи.