Мне удалось сделать исходный вызов после получения токена обновления, но я не могу понять, как вернуть результат в исходную вызывающую функцию.
Я создал перехватчик ошибок, чтобы проверить токен с истекшим сроком действия ..., а такжесохранить все входящие запросы.После успешного обновления токена должны быть вызваны все сохраненные запросы.Мне удалось добраться до точки, где исходный запрос срабатывает.Моя задача продолжается с того места, где разветвитель разветвляется, чтобы обновить токен.Это то, что я сделал до сих пор ..
Перехватчик ошибок
retryWhen(incrementalRetry({
scalingDuration: 2000,
excludedStatusCodes: [500],
headerAllow: request.headers.get('retry')
})),
catchError((err: HttpErrorResponse) => {
if (err.error instanceof ErrorEvent) {
errorMessage = `Error: ${err.error.message}`;
} else {
if (err.error instanceof ErrorEvent) {
errorMessage = `Error: ${err.error.message}`;
} else {
if (err.status === 404) {
console.log('Not Found');
} else if (err.status === 500) {
console.log('Server Error');
} else if ((err.status === 401) && !AuthenticationService.gettingRefreshToken.value) {
this.addRequestToQueue(request);
// console.log(this.requestQueue);
if (!AuthenticationService.gettingRefreshToken.value) {
this.authenticationService.getRefreshToken().subscribe((res: any) => {
this.authenticationService.saveloggedInUser(res.accessToken, res.refreshToken);
AuthenticationService.gettingRefreshToken.next(false);
this.startRequest();
});
}
} else {
UtilityService.logout();
// this.notificationService.showError('For security reasons, please log in again.', 'Authentication' +' Error';);
}
}
}
const error = err.error.message || err.statusText;
if (request.headers.get('popup-error') === 'true') {
alert('Error here');
// this.notificationService.showError(error, 'Error');
}
return throwError(error);
}));
Это напоминает оригинальный запрос
private addRequestToQueue(request) {
this.queue.push(request);
}
private startRequest() {
// get next request, if any.
if (this.queue.length > 0) {
this.execute(this.queue[0]);
}
}
private execute(requestData: HttpRequest<any>) {
if (requestData.method.toLowerCase() === 'get') {
this.httpClient.get(requestData.url,
Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
} else if (requestData.method.toLowerCase() === 'post') {
this.httpClient.post(requestData.url,
requestData.body, Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
} else if (requestData.method.toLowerCase() === 'delete') {
this.httpClient.delete(requestData.url,
Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
} else if (requestData.method.toLowerCase() === 'put') {
this.httpClient.put(requestData.url, requestData.body,
Constants.getTokenHttpHeaders(requestData.headers.get('retry'), requestData.headers.get('popup-error')))
.subscribe(res => {
this.queue.shift();
this.startRequest();
return res;
});
}
}
Я пытаюсь выяснить, какзаставить казнь продолжатьсят.е. вернуть результат в вызывающую функцию.Я продолжаю получать сообщение об ошибке токена, срок действия которого истек, и когда я проверял сеть, звонок фактически был сделан.