Невозможно получить синхронизацию из внутренней подписки для внешней подписки, используя localStorage или sessionStorage - PullRequest
0 голосов
/ 28 июня 2019

У меня есть это отображение:

User     *----------------------------1     Role

Из списка пользователей я иду к одному пользователю из этого списка. Чтобы получить некоторую информацию об этом выбранном пользователе, мне нужно использовать localSorage, чтобы получить объект от внутри подписки до снаружи подписки .

Ниже приведен метод:

this.userService.getAllRolesOfActualUser(user.id).subscribe(listRoles =>
{

     let roles:Array<Role> = [];

     if (listRoles)
     {
         listRoles.forEach((role) =>
         {
             roles.push(new Role(role.id, role.name, role.selected));
         });
     }

     sessionStorage.removeItem("roles");
     sessionStorage.setItem("roles", JSON.stringify(roles));
     console.log("1. Inside Subscribe- " + user.id + "--------------: " + 
     sessionStorage.getItem("roles"));

});

console.log("2. Outside Subscribe- " + user.id + "--------------: " + sessionStorage.getItem("roles"));

Вкл. user.service.ts , у меня есть:

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

Моя проблема в том, что обычно я получал значение предыдущего опрошенного пользователя, а не фактического пользователя, описанного этим снимком экрана :

Не могли бы вы помочь мне решить эту проблему?!. Большое спасибо.

Ответы [ 4 ]

1 голос
/ 28 июня 2019

источник Итак, вы должны работать с Promise:

      getData(){
            var promiseData =return new Promise((resolve, reject) => {
              this.userService.getAllRolesOfActualUser(user.id).subscribe('........')
                    .subscribe(
                     data => {

    //your handlings
                      resolve(data)
                    },
                     error => {
                      reject(error);
                    },
            );
                });
return promiseData;
        }

А в вашем контроллере:

getData().then(data => {
      console.log(data);
//do here what you want
    })

если вы поймете это, просто проверьте это и отметьте

doAsyncTask() {
  let error = true;
   return new Promise((resolve, reject) => {
     setTimeout(() => {
       if (error) {
         reject('error'); // pass values
       } else {
         resolve('done'); // pass values
       }
     }, 1000);
   });
 }

 this.doAsyncTask().then(
  (val) => console.log(val),
  (err) => console.error(err)
);

********* My Edit согласно вашему предложению

doAsyncTask() {
  let error = true;
   return new Promise((resolve, reject) => {
     setTimeout(() => {
       if (error) {
         reject('error'); // pass values
       } else {
         this.userService.getExpertisesListByIdUserObj(2)
                // .subscribe('........')
                .subscribe(listExpertises =>
                      {
                        console.log("YES");
                          let exps:Array<Expertise> = [];

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

                          sessionStorage.removeItem("exps");
                          sessionStorage.setItem("exps", JSON.stringify(exps));
                          console.log("1. MODIF-IN " + 2 + "--------------: " + sessionStorage.getItem("exps"));

              });
         resolve('done'); // pass values
       }
     }, 1000);
   });
 }
1 голос
/ 28 июня 2019

Я не уверен, чего вы на самом деле хотите достичь, но если вы хотите, чтобы результат "вне подписки" прямо ниже в вашем примере, вам, вероятно, придется выполнять свой код более синхронно.

Например, вы могли бы использовать Обещание вместо Наблюдаемого и ожидать выполнения:

await this.userService.getAllRolesOfActualUser(user.id).then(listRoles =>
{

 let roles:Array<Role> = [];

 if (listRoles)
 {
     listRoles.forEach((role) =>
     {
         roles.push(new Role(role.id, role.name, role.selected));
     });
 }

 sessionStorage.removeItem("roles");
 sessionStorage.setItem("roles", JSON.stringify(roles));
 console.log("1. Inside Subscribe- " + user.id + "--------------: " + 
 sessionStorage.getItem("roles"));

});

console.log("2. Outside Subscribe- " + user.id + "--------------: " + sessionStorage.getItem("roles"));

А в вашем распоряжении:

getAllRolesOfActualUser(id: number): Promise<any>
{
    return this.http.get(`${this.baseUrl}/users/roles/${id}`).toPromise();
}
0 голосов
/ 04 июля 2019

Вы должны использовать обещание :

    ses : String[];
    expertises : String[] = [];

    async getUri(userId: number)
        {
            let affected = this.userService.getExpertisesListByIdUserPromise(userId);

            await affected.then((uri) =>
            {
                this.ses = uri;
            })

            return this.ses;
        }

и на ngOnInit у меня есть

this.getUri(16).then(item => 
        {
            item.forEach(pro=>
            {
                this.expertises.push(pro);
            });
        });

в служебном файле, у вас есть:

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

НТН

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

Из вашего user.service.ts вы получаете только один объект из вашего пула объектов (Array of Objects) и в ваших component.ts. Вы сохраняете свою полезную нагрузку как строковый объект, поэтому для получения желаемого результата вам необходимо преобразовать его обратно вJSON, выполнив

let role = sessionStorage.getItem('roles');
let rolesObject = JSON.parse('role')

console.log("1. LIST- " + user.id + "--------------: " +  rolesObject;

Я не знаю, почему вы делаете array.push, но я думаю, что вы должны просто использовать полезную нагрузку в вашем listRoles.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...