Angular: как обрабатывать асинхронный набор переменной

В моем приложении Угловой 6 у меня есть эта услуга; где я объявляю переменную с именем разрешено, эта переменная устанавливается асинхронно в вызове httpClient.get.

@Injectable()
    export class myService implements OnInit {

      permittedPefs = [];
      constructor(){}

      ngOnInit() {
      // STEP 1
      this.loadUserPefsService.getUserRolePefs(roleId).subscribe(
          (returnedListPefs) => {
            this.permittedPefs = returnedListPefs;
          },
          error => {
            console.info(error);
          });
      }
      // STEP 2
      this.myMethod(1);

После этого я вызываю этот метод, который использует мою переменную -предполагаемый установленный -

myMethod(pefId): boolean {
        return this.permittedPefs.includes(pefId);
}

проблема в том, что кажется, что разрешено еще не получил своего значения, а вызов myMethod() указывает на неправильное значение "разрешено"

Итак, каков самый простой способ чтобы заставить его ждать сразу после ответа http, без вызова if из обратного вызова HTTP Response (поскольку я использую его в нескольких местах)

Предложения ??

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вызовите метод this.myMethod(1); из блока subscription, чтобы дождаться завершения асинхронного вызова, который затем установит значение permittedPefs.

ngOnInit() {
      // STEP 1
      this.loadUserPefsService.getUserRolePefs(roleId).subscribe(
          (returnedListPefs) => {
            this.permittedPefs = returnedListPefs;
           // STEP 2
           this.myMethod(1);  // check this line
          },
          error => {
            console.info(error);
          });
}

я уже заметил, что я не буду делать это таким образом: так как мой вызов метода может быть в нескольких местах и ​​в других методах

firasKoubaa 15.08.2018 13:25

По крайней мере, первый вызов внутри ngOnInIt() должен быть таким, как показано. Так что к тому времени у вас будет ценность permittedPefs. Позже вы можете вызывать метод this.myMethod(1) из других мест по своему усмотрению.

Amit Chigadani 15.08.2018 13:38
Ответ принят как подходящий

Асинхронный ад! лучший выбор здесь - получить Observable вместо значения

к вашим услугам:

getValue (): Observable<any>{

return this.loadUserPefsService.getUserRolePefs(roleId);

}

в вашем методе:

 myMethod(pefId): boolean {

       this.yourservice.getValue().subscribe(
       data => {

         if (data){
            return data.includes(pefId);
             }

        });

}

Это происходит потому, что ваш метод вызывается, когда вы еще не получили результат. так что просто переместите вызов функции в функцию подписки

Другие вопросы по теме