Поведение rxjs: как ждать его окончания? - PullRequest
0 голосов
/ 10 февраля 2019

Я реализовал следующую функцию.Если несколько 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 не будут выполнены, а затем я должен заставить загрузчик исчезнуть.Как вы думаете, ребята?

...