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 шт):
В данном случае я делаю следующим образом:
У тебя при авторизации есть три состояния: авторизован, не авторизован и в процессе определения.
Это три разных значения, которые можно сделать в качестве 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.