В моем приложении Угловой 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 (поскольку я использую его в нескольких местах)
Предложения ??



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вызовите метод 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);
});
}
По крайней мере, первый вызов внутри ngOnInIt() должен быть таким, как показано. Так что к тому времени у вас будет ценность permittedPefs. Позже вы можете вызывать метод this.myMethod(1) из других мест по своему усмотрению.
Асинхронный ад! лучший выбор здесь - получить Observable вместо значения
к вашим услугам:
getValue (): Observable<any>{
return this.loadUserPefsService.getUserRolePefs(roleId);
}
в вашем методе:
myMethod(pefId): boolean {
this.yourservice.getValue().subscribe(
data => {
if (data){
return data.includes(pefId);
}
});
}
Это происходит потому, что ваш метод вызывается, когда вы еще не получили результат. так что просто переместите вызов функции в функцию подписки
я уже заметил, что я не буду делать это таким образом: так как мой вызов метода может быть в нескольких местах и в других методах