私はどこにユーザーをログアウトするアプリケーションがありますか、私はRESTエンドポイントにヒットする必要があります。私は私がここでやろうとしていますかを説明しましょうrxjs `Subject`の` next`を呼び出すと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;
}
}
:私の角度2のフロントエンドでは、私はこれを処理し、次のサービスを提供しています。ユーザーがクリックボタンをログアウトすると、私は、このコンポーネントでは、次の関数を呼び出し、
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));
}
問題があることである私が、私はそうのように私のコンポーネントにに加入authEvents
主題を持っていますログアウトの呼び出しがまだ完了していなくても、ブラウザは自宅にリダイレクトされます。効果的には、フロントエンドがうまくログアウトしないことがあります。私はここで間違って何をしていますか?
注:httpコールが行われるため、バックエンドのセッションは常にログアウトします。私はObservables(とrxjs一般的に)を使ってこれを達成する方法も見てみたいと思いますが、あまりにも苦労すればPromisesを使うことができます。
主に副作用やデバッグのために.do()を使用してください。また、私は可能な限り熱い観測を避けようとしています。あなたのアプリのデバッグをやや複雑にすることができます。 – DarkNeuron