Pesquisa de site

javascript - Angular 6: async await alguma variável conseguiu a variável


Sob meu aplicativo Angular 6, eu tenho uma variável "permittedPefs" que está recebendo valor após uma chamada HTTP (assíncrona)

 @Injectable()
 export class FeaturesLoadPermissionsService {
    permittedPefs = [];
    constructor() {       
       this.loadUserPefsService.getUserRolePefs(roleId)
                               .subscribe(
              (returnedListPefs) => {
                this.permittedPefs = returnedListPefs;
              },
              error => {
                console.log(error);
              });
    }
}

em outro método, estou usando a mesma variável:permittedPefs

Mas como está inicialmente vazio e recebe seu valor após algum tempo, então eu preciso esperar para reutilizá-lo.

Eu tentei usar async-await, e meu objetivo é esperar que permittedPefs obtenha um valor de objeto

  async checkPefPresence(pefId) {
    const listPefs = await this.permittedPefs
  }

como consertar isso ??

Resposta #1

Como o método loadUserPefsService.getUserRolePefs retorna um Observable, você pode armazená-lo e se inscrever nele mais tarde quando precisar.

 @Injectable()
 export class FeaturesLoadPermissionsService {
     permittedPefs = [];
     constructor() {
         this.userRolePefsObservable = this.loadUserPefsService.getUserRolePefs(roleId);
     }
 }

 checkPefPresence(pefId) {
     let listPefs;
     this.userRolePefsObservable.subscribe(
         (returnedListPefs) => {
             listPefs = returnedListPefs;
         },
         error => {
             console.log(error);
         });
 }

Resposta #2

Use um behaviorSubject

  @Injectable()
    export class FeaturesLoadPermissionsService {

      permittedPefs: BehaviorSubject<any[]> = new BehaviorSubject([]);

      constructor() {
        this.loadUserPefsService.getUserRolePefs(roleId)
          .subscribe((returnedListPefs) => {
            this.permittedPefs.next(returnedListPefs);
          },
            error => {
              console.log(error);
            });
      }
    }

Então, onde quer que você esteja verificando isso (lembre-se de cancelar a inscrição quando terminar)

se tiver que ser assíncrono, você pode fazer assim abaixo

  async checkPefPresence(pefId): Promise {
    return new Promise((resolve, reject) => {
      this.featuresLoadPermissionsService.permittedPefs.subscribe(listPefs  => {
          //handle whatever check you want to do here 
          resolve();
      },reject);
    })