Angular Остановка выполнения программы до ответа сервера

Проблема: есть булевое, допускающее null свойство isAuthorized, в конструкторе сервиса отправляется get-запрос на сервер, чтобы получить информацию о пользователе и убедиться, что он авторизован.

private _isAuthorized: boolean | null = null;
public get isAuthorized() {
    return this._isAuthorized;
}
constructor(private http: HttpClient) {
     this.update();
}
async update() {
     try {
         this.data = await this.getUserInfo();
         console.log(this.data.userName);
         this.userName = this.data.userName;
         this._isAuthorized = true;
     }
     catch (err) {
         ...
     }
}
getUserInfo(){
    ...
    return this.http.get<User>(this.url, { headers: header }).toPromise();
}

Однако обращение к ствойству isAuthorized может происходить, пока оно еще равно null (то есть пока сервер не ответил).


Ответы (1 шт):

Автор решения: NocteFury

В данном случае я делаю следующим образом:

У тебя при авторизации есть три состояния: авторизован, не авторизован и в процессе определения. Это три разных значения, которые можно сделать в качестве enum.

Далее, создаешь поток, например BehaviorSubject, в который указываешь в качестве Generic типа - этот enum, а в качестве значения по умолчанию - в процессе определения.

Забирая значение из этого потока, фильтруй его на значение в процессе определения, а авторизован и не авторизован - в true и false.

Вот пример:

enum AuthorizationStatus { Grant, Deny, Pending }

const status$ = new BehaviorSubject<AuthorizationStatus>(AuthorizationStatus.Pending);

const isAuthorized$ = status$.pipe(
  filter(status => status !== AuthorizationStatus.Pending),
  map(status => status === AuthorizationStatus.Grant),
);

Таким образом, каждый раз, когда ты не знаешь, авторизован пользователь или нет, то поток просто не стреляет, а значит выполнение потока останавливается. Далее, как только сервер ответит, меняешь статус на другой и поток сразу же стреляет значением, успешна авторизация или нет. Если же статус известен, то поток сразу вернет true или false.

→ Ссылка