Настройка:
У меня есть функция isAuthorized()
в синглтоне AuthSessionSingleton
, которая зависит от результата функции asyn c.
Asyn c функция - это вызов API, вызываемый в конструкторе, который ожидает возврата объекта . isAuthorized()
полагается на этот объект .
Проблема:
Некоторые компоненты вызывают функцию isAuthorized()
немедленно, до разрешения внутреннего вызова. Я хочу иметь возможность подождать внутри функции isAuthorized()
, пока внутренний вызов не разрешится и объект перестанет быть нулевым.
Простой код:
//auth.singleton.ts
@Injectable({providedIn: 'root'})
export class AuthSessionSingleton {
userInfo: UserInfo = null;
constructor(private service: MyService) {
this.loadUserInfo();
}
loadUserInfo() {
this.service.makeBackendCall().subscribe({
next: (obj: UserInfo) => {
this.userInfo = obj;
}
});
}
isAuthorized() {
if(this.userInfo == null) {
// do something to wait asynchronously
}
// Very simple example
if(this.userInfo.Role == 'Admin') {
return true;
}
return false;
}
}
//some.component.ts
export class SomeComponent {
authorized: boolean = false;
constructor(private auth: AuthSessionSingleton) {
this.checkAuthorization();
}
async checkAuthorization() {
this.authorized = await this.auth.isAuthorized();
}
}
В приведенной выше упрощенной программе SomeComponent, вызывающий isAuthorized()
, скорее всего, проверит userInfo
, пока он все еще равен нулю. Мне нужно подождать, пока он не станет нулевым.
Возможные решения:
Я уже определил множество решений. Я ищу наиболее правильное решение и, надеюсь, такое, о котором я даже не подумал.
1. Слушайте подписку
В isAuthorized()
, if(this.userInfo==null)
подпишитесь на ту же подписку, сделанную в loadUserInfo()
, и ждите ее.
2. Подождите, пока не поступит сигнал
Я мог бы создать Subject в AuthSessionSingleton и подписаться на SomeComponent, подождите, пока я не получу сигнал, затем позвоните IsAuthorized()
.
Это кажется особенно окольным .
3. Просто подождите
Есть много способов крутить шестеренки, пока нужный мне объект не перестанет быть нулевым.
while(this.userInfo == null) {
// do something
}
Запрос:
Мне нужен способ асинхронно ждать в isAuthorized()
до this.userInfo != null
. Любое количество вызовов может быть выполнено на isAuthorized()
(от разных компонентов), и все они должны ждать, пока это значение не будет разрешено.
Есть идеи?
Edit
Более точный вариант использования, который, как я понимаю, меняет возможные решения, следует. Его усложняют, принимая массив значений от l oop до.
isAuthorized(roles: string[]) {
let(i = 0; i < roles.length; i++) {
let role = roles[i];
if(this.userInfo.Role == role) {
return true;
}
return false;
}
}