Невозможно получить список из наблюдаемой - PullRequest
0 голосов
/ 27 июня 2019

Я хочу получить список строк, используя 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.log(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.log("----------------- Size: " + storedNames.length);
      console.log(storedNames);

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

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

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

screenshot of empty list

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

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

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

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

как это:

  this.userService.getExpertisesListByIdUser(2).subscribe((listExpertises: Array<any>) => {
    console.log(listExpertises)
    ... // rest of your code
  })
0 голосов
/ 27 июня 2019

Вы пробовали использовать .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.log(storedNames.length);
});

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

getExpertisesListByIdUser(id: number): Observable<yourTypeHere>
{
    return this.http.get<yourTypeHere>(`${this.baseUrl}/users/expertises/${id}`);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...