Угловой 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);
    })
Другие вопросы по тегам