Выполнять сервисную функцию в фоновом режиме каждые 4 минуты в угловых 6 - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь выполнить сервисную функцию в фоновом режиме, которая получает токен обновления с сервера каждые 4 минуты.

 @Injectable()
 export class RefreshTokenService {
 time: any;
 token: string;
 email: string;
 credentials: any;

 constructor(private http: HttpClient) {
 }


  getToken(): string {
   const credentials = localStorage.getItem('credentials');
   if (credentials) {
     const parsedCredentials = JSON.parse(credentials);
     const token = parsedCredentials.token;
     return token;
   }
   return null;
  }

 refreshToken(token: string) {
   const tokenJson: any = {'token': token};
   this.http.post('/api-token-refresh/', tokenJson,   httpOptions).subscribe(response => {
     const data = JSON.parse(JSON.stringify(response));
     this.credentials = JSON.parse(localStorage.getItem('credentials'));
     this.credentials.token = data.token;
     localStorage.setItem('credentials',  JSON.stringify(this.credentials));
   });
 }}

Теперь я выполняю refreshToken() in the app.component.ts внутриngOnInit(), поэтому он выполняется каждый раз, когда я загружаю страницу в приложение, и работает должным образом, но я не нашел подходящего способа вызывать refreshToken() каждые 4 минуты в фоновом режиме.

Я уже смотрел на это, но, похоже, не работает ... Как вызывать функцию каждые 2 минуты в angular2?

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Лучше всего использовать оператор interval и switchMap.

Сначала верните наблюдаемое из функции refreshToken. Используйте оператор карты для выполнения всех других операций, таких как преобразование данных, хранение в локальном хранилище и т. Д. В методе refreshToken().


import { interval, pipe } from 'rxjs'; 
import { map, switchMap } from 'rxjs/operators';

.....

refreshToken(token: string) {
   const tokenJson: any = {'token': token};
   return this.http.post('/api-token-refresh/', tokenJson,   httpOptions);
};

checkingTokenOnInterval(){
     const intervalTime = 4*60*1000;
     const token = 'sdfsdf';
     interval(intervalTime).pipe(switchMap(() => this.refreshToken(token))).subscribe(()=>{
                 //do something 
     });
}

Используйте checkingTokenOnInterval() для вызова вызова refreshToken каждые 4 минуты.

0 голосов
/ 19 января 2019

Будьте в курсе запросов, которые отправляются сразу после обновления запроса токена со старым действительным токеномЯ рекомендую использовать перехватчик и ставить в очередь все запросы, отправленные после refreshToken.Дождитесь, пока придет refreshToken, а затем отправьте запросы очереди.

Другой способ - перехватить ошибку 401 -> запрос на копирование -> refreshToken -> отправить копию запроса.

0 голосов
/ 19 января 2019

Вы можете добиться этого, используя RxJS / таймер https://rxjs -dev.firebaseapp.com / api / index / function / timer

    this.refreshTokenService.refreshToken()
        .pipe
            tap(() => {
                // every 4 minutes refresh the discovery service
                const interval = 4 * 60 * 1000;
                timer(interval, interval).subscribe(() => {
                    this.refresh().subscribe();
                });
            })
        )
        .toPromise();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...