Повторить наблюдаемый внутри обновления токен подписаться - угловой 4
Если у меня есть служба AuthenticationService для обновления токена и перехватчик, который перехватывает вызовы AuthHttp, проблема заключается в том, что в методе перехватчика при сбое вызова я делаю вызов refreshToken, подписавшись на наблюдаемое, затем, когда я получаю ответ, мне нужно вызвать первый http вызов, который был сделан, и не могу заставить его работать:
refreshToken(): Observable<any>{
return this.authHttp.get(GLOBAL.apiurl+'/refresh-token',"").map(
(response) => {
let token = response.json() && response.json().token;
if (token){
console.log('refresh token');
localStorage.setItem('token', token);
return true;
}
else{
console.log('no token');
this.resetLocalStorage();
return false;
}
}
);
}
тогда у меня есть перехватчик для authttp:
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.request(url, options));
}
intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
if (this.isUnauthorized(err.status)) {
//logout the user or do what you want
this.authService.refreshToken().subscribe(result => {
if(!result){
}
HERE THE FIRST FAILED CALL MUST BE CALLED
},
err => {
}
);
if (err instanceof Response) {
return Observable.throw(err.json().message || 'backend server error');
}
return Observable.empty();
} else {
return Observable.throw(err);
}
})
}
1 ответ
В этом блоке вы возвращаете Observable.empty(); вне асинхронного вызова, я думаю, вам нужно назначить это внутри вашего сервисного вызова. Я думаю, что сейчас вы получите пустой возврат, так как вы вернули наблюдаемое, не дожидаясь вызова службы (ниже приведен псевдокод, который может понадобиться для его исправления в зависимости от ваших требований)
if (this.isUnauthorized(err.status)) {
//logout the user or do what you want
this.authService.refreshToken().subscribe(result => {
if(!result){
}
HERE THE FIRST FAILED CALL MUST BE CALLED
// your return must be somewhere here
return Observable.empty();
},
err => {
return Observable.throw(err.json().message || 'backend server error');
}
);
}