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);
})
