Вызов API возвращает пустой объект при вызове из службы Angular

Я получаю это только тогда, когда подписываюсь на функцию, которая вызывает вызов API из службы Angular, поэтому объект, который подписывается на функцию, пуст. Вот мой фрагмент кода из моего сервиса:

getSchedules(): Observable<Schedule[]> {    
  this.http.get<TempSchedules[]>(this.apiUrl).subscribe(x => this.temp = x); 

  this.temp.forEach((e, i) => {    
  // Do something, this loop is never executed because this.temp is empty  
  });
  // Some processing here  
    
return something; }

Вот моя функция http.get где-то внутри службы:

 getTempSchedules(): Observable<TempSchedules[]> {
    return this.http.get<TempSchedules[]>(this.apiUrl);
  }

Из приведенного выше, this.temp пуст. Это почему?

Я вызвал вышеуказанную функцию в конструкторе службы как

  constructor(private http:HttpClient) {     
    this.getTempSchedules().subscribe(x => this.temp = x); 
  }

Вот фрагмент кода из компонента, который вызывает эту функцию в службе:

ngOnInit(): void {
    this.scheduleService.getTempSchedules().subscribe(x => this.tempSchedules = x);  
}

Компонент работает нормально, поэтому, когда я использую значение this.tempSchedules в html, оно отображается правильно. Что мне здесь не хватает?

Отвечает ли это на ваш вопрос? Angular HttpClient объединяет канал, нажмите с подпиской?

Drenai 16.05.2022 01:08

Спасибо @Drenai, это другое. я уже подписался и не использовал пайп в своем квестино

William 17.05.2022 02:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не работает, потому что вы не понимаете, как работает наблюдаемое. Это асинхронный процесс, и вам нужно быть в блоке подписки, чтобы получить его. Если вы хотите сделать что-то необычное с ответом, прежде чем вернуть его компоненту, вам следует использовать map

getTempSchedules(): Observable<Schedule[]> {    
   return this.http.get<TempSchedules[]>(this.apiUrl)
   .pipe(map(res => {
      return res.forEach(() => {
           // Do something, this loop will be executed 
      })
    })) }

используйте его в компоненте как:

ngOnInit(): void {
    this.scheduleService.getTempSchedules().subscribe(x => this.tempSchedules = x);  
}

Спасибо @Shashank. У меня есть эта дилемма. При зацикливании res.forEach((e) => { var day = dd.getDay(); var {index, length} = this.getSlotNumber(e.startTime.hours, e.startTime.minutes, e.endTime.hours, e.endTime.minutes); this.arr[day].times[index] = length; for (var k = index; k<=length+index-1; k++) { console.info(day + ' cc ' + k) this.arr[day].assigned[k] = true; }, когда день = 1, цикл for фактически присваивает значение true для назначенного массива во все дни. где день = от 0 до 6. Любая идея, если это связано?

William 17.05.2022 08:29

@ Уильям Нет, это не связано. Трудно сказать, если я не знаю больше об этой петле. Может быть еще одна проблема

Shashank Vivek 17.05.2022 11:04

Другие вопросы по теме