У меня есть приложение, в котором для выхода из системы пользователя я должен удалять конечную точку REST. В моем угловом 2 фронтэнда, у меня есть следующие услуги, которые обрабатывает это:Вызов `next` из rxjs` Subject` отменяет http-вызов
@Injectable()
export class AuthService {
private authEvents: Subject<boolean>;
constructor(private http: Http) {
this.authEvents = new Subject<boolean>();
}
login(email: string, password: string): Observable<Response> {
const url = 'rest/auth/login';
const body = {
email: email,
password: password
};
return this.http.post(url, body)
.do((res: Response) => {
localStorage.setItem('currentUser', JSON.stringify(res.json()));
this.authEvents.next(true);
});
}
logout(): Observable<Response> {
const url = 'rest/auth/logout';
return this.http.post(url, {})
.do((res: Response) => {
localStorage.removeItem('currentUser');
console.log('hereee!');
this.authEvents.next(false);
});
}
isSignedIn(): boolean {
return localStorage.getItem('currentUser') !== null;
}
get events(): Observable<boolean> {
return this.authEvents;
}
}
Позвольте мне объяснить, что я пытаюсь сделать здесь. У меня есть authEvents
предмет, который я подписаться на мой компонент, как так:
ngOnInit() {
this.isSignedIn = this.authService.isSignedIn();
this.authService.events.subscribe(() => {
this.isSignedIn = this.authService.isSignedIn();
});
}
Когда пользователь нажимает кнопку выхода из системы, я вызвать следующую функцию в этом компоненте:
logout() {
this.authService.logout()
.subscribe(() => {
this.router.navigate(['/home']);
}, e => this.handleError(e));
}
Проблема заключается в том, что переадресация браузера на дом, даже если вызов для выхода еще не завершен. Так эффективно, иногда интерфейс успешно выходит из системы, а иногда и нет! Что я здесь делаю неправильно?
Примечание: сеанс на бэкэнд всегда выходит из системы, так как HTTP-вызов действительно происходит. Я также хотел бы посмотреть, как использовать Observables (и rxjs в целом) для достижения этого, хотя, если слишком много проблем, то Promises могут быть использованы.
Осторожно, используя .do(), как и для побочных эффектов и отладки в основном. Кроме того, я старался избегать горячих наблюдателей, когда это было возможно. Они могут сделать отладку вашего приложения немного сложнее. – DarkNeuron