Я реализовал следующую функцию.Если несколько HTTP-вызовов возвращают токен с истекшим сроком действия, один из них должен сделать вызов refreshtoken, и после завершения вызова refreshtoken остальные вызовы должны быть повторены.У меня проблема с загрузчиком.Я покажу свой код, а затем объясню, что.
if (this.refreshTokenInProgress) {
return this.refreshTokenSubject
.filter(result => result !== null)
.pipe(
take(1),
switchMap(() => {
return this.getTokenObservable().pipe(switchMap((user_tokens) => {
return next.handle(this.addToken(user_tokens, request));
}));
}),
tap(evt => {
this.loaderService.storeLoaderOff();
})
)
} else {
this.refreshTokenInProgress = true;
this.refreshTokenSubject.next(null);
return this.refreshAccessToken().pipe(
switchMap((token: any) => {
this.refreshTokenInProgress = false;
this.refreshTokenSubject.next(token.access_token);
return this.getTokenObservable().pipe(switchMap((user_tokens) => {
return next.handle(this.addToken(user_tokens, request)).pipe(tap(evt => {
// this.loaderService.storeLoaderOff();
}))
}));
}),
catchError((err: any) => {
this.loaderService.storeLoaderOff();
this.refreshTokenInProgress = false;
this.authService.logoutUser();
return throwError(error);
})
);
}
, иначе это означает, что он должен сделать вызов refreshtoken, а когда это будет сделано, он выполнит следующую функцию по теме.Другие вызовы были «если», ожидая, чтобы они не были нулевыми.Если следующий объект задан по теме, и он не равен нулю, я беру новый токен из хранилища, которое положил туда refreshtoken (getTokenObservable ()), и повторяю запрос.Все дело в том, чтобы посмотреть на метод tap в операторе if.Что на самом деле происходит, так это 4 звонка на http, все они возвращаются tokenexpired.один из них сделал refreshtoken, и загрузчик сразу же закончил.После того, как загрузчик исчезает, он повторяет остальные оставшиеся вызовы http.
Может быть, я хочу подождать, пока все ожидающие refreshTokenSubject не будут выполнены, а затем я должен заставить загрузчик исчезнуть.Как вы думаете, ребята?