Не удается получить список из Observable

Я хочу получить список строк, используя localStorage, представленный:

this.userService.getExpertisesListByIdUser(2).map((listExpertises: Array<any>) =>
      {
          let result:Array<Expertise> = [];
          let libs:Array<String> = [];
          if (listExpertises)
          {
              listExpertises.forEach((expert) =>
              {
                  libs.push(expert.name);
                  result.push(new Expertise(expert.id, expert.name, expert.username));
              });
          }

          localStorage.removeItem("libs");
          localStorage.setItem("libs", JSON.stringify(libs));

      })

      var storedNames = JSON.parse(localStorage.getItem("libs"));
      console.info(storedNames.length);   // That gives 0 as length : WRONG

метод getExpertisesListByIdUser:

getExpertisesListByIdUser(id: number): Observable<any>
{
    return this.http.get(`${this.baseUrl}/users/expertises/${id}`);
}

Как прокомментировано, я получил длину как 0. Я получил правильный результат, если поставил localStorage снаружи map. Но он мне нужен внутри map, чтобы получить синхронизация.

Теперь размер правильный с этим кодом.

this.userService.getExpertisesListByIdUser(2).subscribe(listExpertises => {

         let libs:Array<String> = [];
         let exps:Array<Expertise> = [];

         if (listExpertises)
         {
             listExpertises.forEach((expert) =>
             {
               libs.push(expert.name);
               exps.push(new Expertise(expert.id, expert.name, expert.selected));
             });
         }

         localStorage.removeItem("libs");
         localStorage.setItem("libs", JSON.stringify(libs));

         localStorage.removeItem("exps");
         localStorage.setItem("exps", JSON.stringify(exps));

      });

      var storedNames = JSON.parse(localStorage.getItem("libs"));
      var storedExperties = JSON.parse(localStorage.getItem("exps"));
      console.info("----------------- Size: " + storedNames.length);
      console.info(storedNames);

      storedNames.forEach((name: string) =>
      {
          console.info("--------------Name from list of strings: " + name);
      });

      storedExperties.forEach((exp: Expertise) =>
      {
          console.info("--------------Name from list of objects: " + exp.name);
      });

но на консоли я получил:

Не удается получить список из Observable

Не могли бы вы сказать мне, что я пропустил?.

Заранее спасибо.

Я думаю, вы пропустили subscribe

splash 27.06.2019 11:40

Здравствуйте, сэр @splash, это работает.

Missar 27.06.2019 12:05

Вы также можете сделать то же самое, используя карту, но тогда вам также придется использовать var StoredNames = JSON.parse(localStorage.getItem("libs")); console.info(хранимыеИмена.длина); внутренняя карта

sah1 27.06.2019 12:11
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
3
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы пробовали использовать .subscribe()?

this.userService.getExpertisesListByIdUser(2).subscribe(listExpertises => {
   let result:Array<Expertise> = [];
   let libs:Array<String> = [];
   if (listExpertises)
   {
       listExpertises.forEach((expert) =>
       {
         libs.push(expert.name);
         result.push(new Expertise(expert.id, expert.name, expert.username));
       });
   }

   localStorage.removeItem("libs");
   localStorage.setItem("libs", JSON.stringify(libs));

   var storedNames = JSON.parse(localStorage.getItem("libs"));
   console.info(storedNames.length);
});

.map() следует использовать только в том случае, если вы хотите добавить функции канала к наблюдаемому объекту. Также вам не нужно определять тип ответа внутри функции подписки. Если вы хотите определить свой тип ответа, вы делаете это при использовании http-клиента.

getExpertisesListByIdUser(id: number): Observable<yourTypeHere>
{
    return this.http.get<yourTypeHere>(`${this.baseUrl}/users/expertises/${id}`);
}

@Missar Конечно, вы должны быть уверены, что то, что вы получаете из ответа, не является пустым массивом/списком.

kebbaben 27.06.2019 11:49

@Missar Вы не должны редактировать ответ, чтобы задать вопрос, связанный с ответом. Вы должны спросить в его комментариях. Вы говорите, что длина списка из ответа равна 1, но вы не получаете от него никаких желаемых значений. В этом случае вы должны console.info() просмотреть список в первую очередь.

kebbaben 27.06.2019 12:14

@Миссар, я имел в виду, что вы должны регистрировать весь объект, а не его длину. Вот так: console.info(listExpertises) в верхней части функции подписки.

kebbaben 27.06.2019 12:19

Извините, сэр @kebbaben, за это. Возвращаю ответ. console.info(listExpertises) создает пустой список. Я прикрепил к своему вопросу скриншот. Не могли бы вы взглянуть. Большое спасибо, сэр.

Missar 27.06.2019 12:27

@Миссар, и вы записываете это первым, что вы делаете в функции подписки? Если это так, то проблема заключается в ответе http. Сам массив не нулевой, но один элемент в нем есть. Вероятно, это означает, что здесь виновата функция, связанная с ${this.baseUrl}/users/expertises/${id}. Проверьте эту функцию и убедитесь, что URL-адрес правильный с обеих сторон.

kebbaben 27.06.2019 12:32

URL http://localhost:6227/api/auth/users/expertises/2 выдает на почтальоне [ "Angular" ]

Missar 27.06.2019 12:40

@Missar Тогда вы уверены, что URL-адрес в вашем коде правильный? Вы на 100% уверены, что ${id} на самом деле равен 2, когда вы вызываете функцию?

kebbaben 27.06.2019 12:43

Хорошо, сэр, я нашел это. Мне нужно добавить конструктор с полями в сущности (Spring Boot). Большое спасибо, сэр.

Missar 27.06.2019 12:53

Кстати, сэр, у вас есть другой способ поддерживать синхронизацию между inside subscribe и outside subscribe, кроме localStorage.

Missar 27.06.2019 14:15

@Missar просто сохраните libs в локальной переменной вместо того, чтобы устанавливать ее в localStorage, если вы просто хотите сохранить ее в том же файле.

kebbaben 27.06.2019 14:18

Но это не может поддерживать синхронизацию от inside subscribe до outside subscribe. this.userService.getExpertisesListByIdUser(+userId).subscrib‌​e(listExpertises => { if (listExpertises) { listExpertises.forEach((expert) => { this.libs.push(expert); }); } }); this.libs.forEach((name: string) => { console.info("--------------Name: " + name); }); Я получил нулевое значение, поэтому

Missar 27.06.2019 14:39

Синхронизация @Missar с наблюдаемыми сложна и, как правило, неправильный путь. Обычно вы делаете все, что связано с данными из наблюдаемого внутри, с помощью функции подписки. Узнайте больше о Наблюдаемые и Наблюдаемые в Angular

kebbaben 27.06.2019 14:45

@Миссар, если это помогло вам, не могли бы вы отметить как ответ?

kebbaben 27.06.2019 14:55

Используйте .subscribe

так:

  this.userService.getExpertisesListByIdUser(2).subscribe((listExpertises: Array<any>) => {
    console.info(listExpertises)
    ... // rest of your code
  })

@Missar Вы не должны редактировать ответ, чтобы задать вопрос, связанный с ответом. Покажите console.info(listExpertises)

Adrita Sharma 27.06.2019 12:16

Извините, миссис @AdritaSharma, за это. Возвращаю ответ. console.info(listExpertises) создает пустой список. Я прикрепил к своему вопросу скриншот. Не могли бы вы взглянуть. Большое спасибо миссис

Missar 27.06.2019 12:29

Похоже, у вас проблемы с бэкендом. Попробуйте с почтальоном и проверьте

Adrita Sharma 27.06.2019 12:31

Привет, миссис @ Адрита Шарма, в почтальоне все было в порядке. Я получил [ "Angular" ]

Missar 27.06.2019 12:37

Хорошо, мисс, я нашел это. Мне нужно добавить конструктор с полями в сущности (Spring Boot). Большое спасибо, мисс. Кстати, мисс, у вас есть другой способ поддерживать синхронизацию с inside subscribe на outside subscribe, кроме localStorage.

Missar 27.06.2019 14:17

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