Итак, у меня есть метод put, который возвращает наблюдаемый, внутри этого метода мне нужно проверить, является ли токен действительным, если он недействителен, тогда мне нужно будет вызвать другой метод, который может создать новый токен обновления, и я необходимо подписаться на этот метод, чтобы я мог обновить значения локального токена обновления и затем вернуть наблюдаемое для метода put.
Это то, что я имею до сих пор:
public putRequest(endpoint: string, body: any):
Observable < APIResponseModel < any >> {
if (this.authService.isValidToken()) {
// . . .
}));
}
else {
// get a new token
const refresh = this.authService.refreshToken();
return refresh.switchMap(response => {
this.authService.setRefreshToken(response.results.refreshToken);
return this.httpClient.put < any > (`${endpoint}`, body).pipe(map(result => {
this.hideLoader();
return result;
}));
}).catch(err => {
console.log("error occurred! " + err)
this.authService.redirectToLogin();
return this.getNullResponse();
});
}
Методы AuthService:
isValidToken(): boolean {
const token = this.getAuthToken();
if (!token && this.firstload) {
return true; }
if (token && !this.firstload) {
if (this.jwtHelper.isTokenExpired(token)) {
console.log("Token is expired ");
return false;
} else {
return true;
}
} else {
return false;
}
}
refreshToken(): Observable<APIResponseModel<any>> {
console.log("refresh token:" + this.getRefreshToken());
const url = `${environment.baseAPIUrl}/${environment.version}/login/token/refresh`;
const body = {
refreshToken: `${this.getRefreshToken()}`
};
return this.httpClient.post(url, body).map((response: APIResponseModel<any>) => {
this.setAuthToken(response.results.token);
this.setRefreshToken(response.results.refreshToken);
this.tokenBeingRefreshed = false;
return response;
}, err => err);
}
Обратите внимание, что я пробовал SwitchMap и MergeMap, но я получаю сообщение об ошибке сервера, что сеанс истек. Кажется, я получаю эту ошибку, прежде чем ждать создания нового токена. Как я могу убедиться, что новый токен создан перед вызовом httpClient.put?