Угловой 6: асинхронное ожидание какой-то переменной получил переменную
В моем приложении Angular 6 у меня есть переменная "allowPefs", которая получает значение после HTTP-вызова (асинхронный)
@Injectable()
export class FeaturesLoadPermissionsService {
permittedPefs = [];
constructor() {
this.loadUserPefsService.getUserRolePefs(roleId)
.subscribe(
(returnedListPefs) => {
this.permittedPefs = returnedListPefs;
},
error => {
console.log(error);
});
}
}
в другом методе я использую ту же переменную:allowPefs
Но так как он изначально пустой и через какое-то время он возвращает свое значение, мне нужно подождать, пока он снова не будет использован.
Я попытался использовать async-await, и моя цель - дождаться, чтобы разрешенный файл получилзначение объекта
async checkPefPresence(pefId) {
const listPefs = await this.permittedPefs
}
как это исправить??
2 ответа
Так как метод loadUserPefsService.getUserRolePefs возвращает Observable, вы можете сохранить его и подписаться на него позже, когда вам это понадобится.
@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);
});
}
Использовать поведение Subject
@Injectable()
export class FeaturesLoadPermissionsService {
permittedPefs: BehaviorSubject<any[]> = new BehaviorSubject([]);
constructor() {
this.loadUserPefsService.getUserRolePefs(roleId)
.subscribe((returnedListPefs) => {
this.permittedPefs.next(returnedListPefs);
},
error => {
console.log(error);
});
}
}
Тогда где бы вы ни проверяли его (не забудьте отписаться, когда закончите)
если он должен быть асинхронным, вы можете сделать это, как показано ниже
async checkPefPresence(pefId): Promise {
return new Promise((resolve, reject) => {
this.featuresLoadPermissionsService.permittedPefs.subscribe(listPefs => {
//handle whatever check you want to do here
resolve();
},reject);
})